LoginSignup
88
88

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-03-07

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

やりたいこと

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); // 何も入らない
});
88
88
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
88
88