私は今週、passport.js を使用して、プライベート API に Facebook 認証を使用する最良の方法を見つけようと数日を費やしました。これには、passport-facebook-token が最適です。
これらが 2 つの別個の認証戦略であると想定するのは正しいことです。Passport-facebook-token を使用するために、passport-facebook をインストールする必要はありません。
クライアント側の JS (または iOS など) に Facebook 認証を実装していて、ユーザーの Facebook authToken を使用して API リクエストを認証する方法を探している場合、passport-facebook-token は非常に洗練されたソリューションです。
Passport-facebook-token は、passport-facebook とは完全に独立して動作し、基本的に、リクエストをコントローラーに渡す前に、Facebook が必要とするリダイレクトを内部で処理します。
したがって、passport-facebook-token を使用して API ルートを認証するには、次のようにパスポート戦略を設定する必要があります。
passport.use('facebook-token', new FacebookTokenStrategy({
clientID : "123-your-app-id",
clientSecret : "ssshhhhhhhhh"
},
function(accessToken, refreshToken, profile, done) {
// console.log(profile);
var user = {
'email': profile.emails[0].value,
'name' : profile.name.givenName + ' ' + profile.name.familyName,
'id' : profile.id,
'token': accessToken
}
// You can perform any necessary actions with your user at this point,
// e.g. internal verification against a users table,
// creating new user entries, etc.
return done(null, user); // the user object we just made gets passed to the route's controller as `req.user`
}
));
User.findOrCreate
Passport-facebook-token Readme で使用されているメソッドは、デフォルトの mongo/mongoose メソッドではなく、必要に応じてインストールする必要があるプラグインであることに注意してください。
access_token
この認証戦略をルートのミドルウェアとして使用するには、オブジェクトを URL パラメーターとして、またはリクエスト本文のプロパティとして渡す必要があります。
app.get('/my/api/:access_token/endpoint',
passport.authenticate(['facebook-token','other-strategies']),
function (req, res) {
if (req.user){
//you're authenticated! return sensitive secret information here.
res.send(200, {'secrets':['array','of','top','secret','information']});
} else {
// not authenticated. go away.
res.send(401)
}
}
注意。プロパティはaccess_token
大文字と小文字を区別し、アンダースコアを使用します。Passport-facebook-token のドキュメントは広範囲ではありませんが、ソースは非常によくコメントされており、非常に読みやすいので、内部を参照することをお勧めします。確かに、パスポートが機能するより一般的な方法のいくつかに頭を悩ませるのに役立ちました。