Node.js
Express
Passport

Node.js+Express+Passportで認証情報をセッションに保存する方法

More than 3 years have passed since last update.

公式のドキュメント見ながら実装したら、ちょっとつまずいたのでメモしておきます。

やりたいこと

passportを使って、facebookやtwitterでauth認証をして、取得した値をセッションに保持したい。

環境

  • Node.js (0.10.25)
  • Express (3.4.8)
  • passport (0.2.0)

passportについて

passportはnode.jsでauth認証を実装するためのモジュールです。
なんと140以上のサービスのauth認証に対応しているとか。
node.jsでauth認証をするモジュールとしては、他にoauthとかがありますが、ドキュメントがほとんどが無いので、機能・情報ともに充実しているpassportがオススメです。

実装

認証機能の実装自体はPassportの公式サイトのGuideを参照してください。
ほぼコピペでできます。

ただセッションに値をセットする方法が、少し分かりにくかったので以下に記載します。

通常Expressではセッションに値をセットするとき、以下のようにしますが、

exports.hoge = function(req,res){
    req.session = hogehoge;
};

passportを使うとコールバック関数でリクエストを処理をするので、req変数にアクセスする方法が分かりませんでした。

// 以下はGuideのサンプルをコピペ

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://www.example.com/auth/facebook/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    User.findOrCreate(..., function(err, user) {
      if (err) { return done(err); }
      done(null, user);
    });
  }
));

このとき、passport.serializeUserメソッドを使って値をセットできます。
上のソースコードのdoneで渡したuserが、passport.serializeUserの第一引数のuserです。

passport.serializeUser(function(user, done) {
  done(null, user.id); // user.idをセット
});

セットされた値は、req.session.passport.userに入るため、次回以降のアクセスで値を参照することができます。

ちなみに、以下のように書いてしまうとreq.session.passportに何も値が入らなかったので注意しましょう。

passport.serializeUser(function(user, done) {
  done(null, user); // 何も入らない
});