web-dev-qa-db-ja.com

Passport.js:passport-facebook-token戦略、JS SDKを介してログインし、パスポートを認証しますか?

クライアントにFacebookJS SDKで承認させてから、どういうわけかこの承認をノードサーバーに転送する方法を探していました(fbグラフAPIでリクエストを確認できるようにするため)

私は偶然見つけました: https://github.com/jaredhanson/passport-facebook/issues/26

https://github.com/drudge/passport-facebook-token

passport-facebookとはまったく異なる戦略のようです。

私はそれを仮定するときに正しいですか:

Fb JS SDKを使用してログインすると、facebook-token戦略により、ドキュメントまたは本文オブジェクトからトークンとfb idが抽出されますか?

それとも、これを達成するための他のまともな方法はありますか?つまり、サーバーSDKによって強制されるリダイレクトを回避しようとしています

23
matthiasdv

私は今週、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`
  }
));

Passport-facebook-tokenReadmeで使用されるUser.findOrCreateメソッドは、デフォルトのmongo/mongooseメソッドではありませんが、必要に応じてインストールする必要があるプラグインであることに注意してください。

この認証戦略をルートのミドルウェアとして使用するには、URLパラメーターまたはリクエスト本文のプロパティとしてaccess_tokenオブジェクトを渡す必要があります。

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のドキュメントは広範ではありませんが、ソースは非常によくコメントされており、非常に読みやすいので、内部を確認することをお勧めします。それは確かに私がパスポートが機能するより一般的な方法のいくつかに頭を包むのを助けました。

38
Orangetronic