Node.jsのoauthモジュールでTwitterのOAuth認証をしてみた

Expressを触り始めて何か作りたくなったので、とりあえず認証だけ作ってみた。
DB使うのが面倒くさかったのでサクッとできそうなTwitterOAuth認証で、ログイン→認証→リダイレクトして管理画面トップへ、みたいに遷移するとこまでやってみた。

ExpressでTwitter認証は、node.js+socket.io+oauth+SessionWebSocketでログイン付きチャットを作るメモ - すぎゃーんメモがとても参考になった。というかほぼそのままw
Expressのバージョンは2.5なので、"/routes"の下にコントローラファイルがあるのがちょっと違うとこですね。

  • routes/index.js
/**
 * Authorize by oAuth.
 */
exports.auth = function(req, res) {
    var oAuthClient = createOAuthClient();
    var oAuthToken = req.query.oauth_token;
    var oAuthVerifier = req.query.oauth_verifier;
    if (oAuthToken && oAuthVerifier && req.session.oauth) {
        oAuthClient.getOAuthAccessToken(oAuthToken, null, oAuthVerifier,
            function(error, oauth_access_token, oauth_access_token_secret, results) {
                if (error) {
                    res.send(error, 500);
                } else {
                    req.session.user = results.screen_name;
                    res.redirect('/admin/');
                }
            }
        );
    } else {
        oAuthClient.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results) {
            if (error) {
                res.send(error, 500);
            } else {
                req.session.oauth = {
                    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);
            }
        });
    }
};

var createOAuthClient = function() {
    return new (require('oauth').OAuth)(
        'https://api.twitter.com/oauth/request_token',
        'https://api.twitter.com/oauth/access_token',
        'CONSUMER KEY',
        'CONSUMER SECRET KEY',
        '1.0',
        '{SITE URL}/auth',
        'HMAC-SHA1');
};

/**
 * Get admin index.
 */
exports.admin = {
    index: function(req, res) {
        console.log(JSON.stringify(req.session));
        res.render('admin/index', {
            title: 'Express',
            username: req.session.user
        });
    }
};


コントローラ上手く分けないともう多いw
でもapp.jsにrequire大量に書くのは嫌だなあ。。みんなどうしてるんだろう。

node-oauthモジュールHTTPSで認証できないみたいな記事もチラホラ見かけましたが、自分が使ったバージョン(0.9.5)では特にエラーが出ることなく認証できました。