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