【Node.js】Express + Passport をつかってみた

PassportはStrategyというオブジェクトを切り替えることで140以上の認証方法に対応したNode.jsのモジュールです。
今回はtwitter、facebookで認証の練習をしました。

Passportを使うための準備

環境は以下。カーネルが意外と古いです。


$ uname -a
Linux 2.6.32-358.11.1.el6.x86_64 #1 SMP Wed Jun 12 03:34:52 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS release 6.4 (Final)

Node.jsはインストールしている状態で以下でPassportをインストールします。


$ npm install passport
$ npm install passport-twitter
$ npm install passport-facebook

app.jsに以下を追加します。


var express = require('express')
  // other mod
  , passport = require('passport')
  , TwitterStrategy = require('passport-twitter').Strategy
  , FacebookStrategy = require('passport-facebook').Strategy; 

twitterで認証

TwitterDevでアプリ登録をします。
TWITTER_CONSUMER_KEYとTWITTER_CONSUMER_SECRETはメモっておきます。

まずはPassportのSetupです。


passport.serializeUser(function(user, done){
  done(null, user);
});
passport.deserializeUser(function(obj, done){
  done(null, obj);
});

passport.use(
  new TwitterStrategy({
  consumerKey: "yourCode", // TWITTER_CONSUMER_KEY
  consumerSecret: "yourCode",// TWITTER_CONSUMER_SECRET
  // callbackURLの指定
  callbackURL: "https://localhost:3000/auth/twitter/callback"
  }, function(token, tokenSecret, profile, done) {
    profile.twitter_token = token;
    profile.twitter_token_secret = tokenSecret;

    process.nextTick(function () {
      return done(null, profile);
    });
  })
);

profile.twitter_token = token;と代入しておくことでAPIを叩くときに参照できるようになります。

/auth/twitterにアクセスしたときに認証成功時に/index.html、失敗時に/loginにルーティングしています。
この辺の認証成功時、失敗時の処理の書き方が簡単ですね。


app.get("/auth/twitter", passport.authenticate('twitter'));

// Twitter callback Routing
app.get("/auth/twitter/callback", passport.authenticate('twitter', {
  successRedirect: '/index.html',
  failureRedirect: '/login'
}));

自分のアカウントで試しにログインしてみるとrequest.user.usernameに自分のIDが入っていることが確認できました。


app.get('/index.html', function(request, response) {
  console.log(request.user.username); 
  fs.readFile('public/index.html', 'UTF-8', function(err, data) {
  if (err) {
    return console.log(err);
  }
    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.end(data);
  });
});

最初に/auth/twitterにアクセスしたときに以下のout-of-bandエラーで怒られました。


Desktop applications only support the oauth_callback value 'oob'

setting でCallback URLを指定できるのですがこれを書いてないのが原因みたいです。

twApp

facebookで認証

twitterでの認証と基本的に同様です。
App IDとApp Secretが必要です。


passport.use(
  new FacebookStrategy({
  clientID: "yourCode", 
  clientSecret: "yourCode",
  callbackURL: "https://localhost:3000/auth/Facebook/callback" 
  },function(accessToken, refreshToken, profile, done){
    passport.session.accessToken = accessToken; 

    process.nextTick(function(){
    done(null ,profile);
    });
  })
);

Passportは予想以上に簡単でした。これでまたNode.jsから離れられなくなる。