公式のドキュメント見ながら実装したら、ちょっとつまずいたのでメモしておきます。
やりたいこと
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); // 何も入らない
});