Sat Oct 26 14:25:10 JST 2013

node.js + oauth だけでTwitter認証

ログインが可能なTwitterアカウント と,
Twitterクライアントと呼ばれる単位の (consumer_key, consumer_secret) とから
アカウントのクライアントに対する

(access_token_key, access_token_secre)

これを取得するまで. その4つを一回取得できれば,もうメモしといて未来永劫どうとでも使える

まず,
npmでモジュール追加する場合,-g オプションは有効に使いましょう
初めのPCでそれをする場合は,インストールした際にメッセージをよく読み,どのディレクトリに入ったかを見たら
環境変数 NODE_PATH に書いときましょう

cympfh@:~$ echo $NODE_PATH
/usr/local/lib/node_modules/

このサイトのソースコードを大いに参照しました.
わかってしまえば,そのまんまなのに,随分長いことできなかったから.
http://d.hatena.ne.jp/sugyan/20110105/1294157289

いやほんとは,ずっと前にも同じプログラムは書いたのだけど,例のnpm はデフォルトでその場にディレクトリ作って そこにモジュール保存するとかしらなくて,ディレクトリがごちゃごちゃしてたから一緒に間違えて削除しちゃったの

作り方

まずサーバを作ります サーバは簡単に作れることで http://nodejs.org/ にも載ってるわけですけど,実際的には express モジュールなんかを使います

$ sudo npm install -g express

モジュールだけでなく,expressコマンドも一緒に入ります.

てきとーな,実験用のディレクトリに移って

$ express hogehoge

hogehogeというディレクトリが出来て,中には app.js routes/ などなどが入ってます メッセージの指示通りに

$ cd hogehoge && npm install

たぶん普通いじるのは app.js か routes/index.js なんかだと思います 必要最小限のことがらが書かれたファイルなので,書き足すようにする

express のバージョンによって随分と中身は違うようなので,まるまるをブログに載っけてるのを よく見かけるけど,自分のと違ってても気にしちゃいけない.

app.getは,どうもその相対パスのurlが来たらどうするか,をappに登録してて, そのappを持って,

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

サーバが動くようなので,これよりも上に,次のようなものをコピペ

var oauth = new (require('oauth').OAuth)(
     'https://api.twitter.com/oauth/request_token',
     'https://api.twitter.com/oauth/access_token',
     'qnNRwjeo8zFjhIDfgG1F6Q',                     // CONSUMER_KEY (replace)
     'JtKRv1e9QIEG6mKvWl0g4ygGVGzWclgfd7GaSBEGtg', // CONSUMER_SECRET (replace)
     '1.0',
     'http://127.0.0.1:3000/signin/twitter', // callback URL
     'HMAC-SHA1'
 );

 app.get('/signin/twitter', function(req, res) {
     var oauth_token    = req.query.oauth_token;
     var oauth_verifier = req.query.oauth_verifier;
     if (oauth_token && oauth_verifier) {
         console.log("##", oauth_token, oauth_verifier);
         oauth.getOAuthAccessToken(
             oauth_token, null, oauth_verifier,
             function(error, oauth_access_token, oauth_access_token_secret, results) {
                 if (error) {
                     res.send(error, 500);
                 } else {
                     // req.session.user = results.screen_name;
                     console.log("@@@", oauth_access_token, oauth_access_token_secret);
                     res.end(oauth_access_token + " " + oauth_access_token_secret);
                     // res.redirect('/');
                 }
             }
         );
     } else {
         oauth.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results) {
             if (error) {
                 res.send(error, 500);
             } else {
                 req.session = {
                     oauth_token: oauth_token,
                     oauth_token_secret: oauth_token_secret,
                     request_token_results: results
                 };
                 res.redirect('https://api.twitter.com/oauth/authorize?oauth_token=' + oauth_token);
             }
         });
     }
 });

はい,これで ブラウザで http://127.0.0.1:3000/signin/twitter に言ってごちゃごちゃすると 欲しかったものが得られます

dev.twitter.com の方で,アプリケーションのコールバックurlを登録するけど,あれ関係ないよね?


Author : 枚方 (Hirakata)
e-mail: cympfh@gmail.com