web-dev-qa-db-ja.com

追加のパラメーターをpassport.authenticateに渡す方法

(既に[fbStrategy.passReqToCallback = trueを実行しています)オフにリフティングしています https://scotch.io/tutorials/easy-node-authentication-linking-all-accounts-together このソーシャルを使用したい複数のアプリの認証サービス(例:暖房システムを制御するもの、スプリンクラーをオンにするものなど).

基本的に、これらのアプリの1つがサーバーをチェックし、正しいトークンがない場合、このソーシャル認証サービス(social-auth)にリダイレクトされます。ユーザーがソーシャルログインボタンを押すと、そのアプリのパラメーターを取得し、/auth/facebook/:appidのパラメーターとして追加します。

    // send to facebook to do the authentication
    app.get('/auth/facebook/:appId', function(req,res,next){
        passport.authenticate(
            'facebook', { scope : 'email' }
        )(req,res,next);
    });

req of req,res,nextは、シリアル化されたユーザーレコードです。この時点で、social-authはユーザーが誰であるかを知りません。

fbStrategy.passReqToCallback = true;  
passport.use(new FacebookStrategy(fbStrategy,
    function(req, token, refreshToken, profile, done) {
        var email = (profile.emails[0].value || '').toLowerCase()     
        process.nextTick(function() {...

承認が完了したら、呼び出し元のアプリにリダイレクトし直し、:appIdパラメータを使用して適切なサイトに戻ることができるようにします。

さて、さまざまな社会的状態からcurrentAppIdのような変数にアクセスできるようにしただけで、通常は機能しますが、複数のユーザーが同時に認証を行っている場合は、ユーザーが間違ったアプリに戻る可能性があります。他の一部のユーザーアプリ。そのため、パラメータとしてpassport.authenticateに移動するにはappIdが必要です。どのようにしてどこを見ればよいのでしょうか。 passport.authenticateをラップしたり、その他の方法で変更したりできますか?

16
mcktimo

リクエスト自体を使用して、ストラテジ関数との間で追加のパラメータを転送できます。次の例では、2つのパラメーター_toParamおよび_fromParamはこの懸念のために使用されます。

app.get('/auth/facebook/:appId', function(req,res,next){
    req._toParam = 'Hello';
    passport.authenticate(
        'facebook', { scope : 'email' }
    )(req,res,next);
})


fbStrategy.passReqToCallback = true;  
passport.use(new FacebookStrategy(fbStrategy,
    function(req, token, refreshToken, profile, done) {
        console.log(req._toParam);
        req._fromParam = 'Hello 2';
        var email = (profile.emails[0].value || '').toLowerCase()     
    process.nextTick(function() {...

今後のリクエストでIDを保存する必要がある場合は、現在のリクエストのソケットをキーとするマップを使用できます。

11
Manfred Steiner