web-dev-qa-db-ja.com

Passport戦略コールバックでリクエストオブジェクトを取得する

パスポートとFacebook戦略の私の構成は次のとおりです。

    passport.use(new FacebookStrategy({
        clientID: ".....",
        clientSecret: ".....",
        callbackURL: "http://localhost:1337/register/facebook/callback",
    },
    facebookVerificationHandler
    ));

そして、これがfacebookVerificationHandlerです:

var facebookVerificationHandler = function (accessToken, refreshToken, profile, done) { 
    process.nextTick(function () {    
        .......
    });    
};

FacebookVerificationHandlerのリクエストオブジェクトにアクセスする方法はありますか?

ユーザーはLocalStrategyを使用して私のサイトに登録されていますが、ソーシャルアカウントを追加し、それらのアカウントをローカルアカウントに関連付けることができます。上記のコールバックが呼び出されると、現在ログインしているユーザーはreq.userで既に利用可能になっているため、reqにアクセスしてユーザーをfacebookアカウントに関連付ける必要があります。

これはそれを実装する正しい方法ですか、それとも別の方法を検討する必要がありますか?

ありがとう。

35
Élodie Petit

このため、アプリケーションの起動時に戦略を設定する代わりに、通常、リクエストがあるときに戦略を設定します。例えば:

app.get(
    '/facebook/login'
    ,passport_setup_strategy()
    ,passport.authenticate()
    ,redirect_home()
);

var isStrategySetup = false;
var passport_setup_strategy = function(){
    return function(req, res, next){
        if(!isStrategySetup){

            passport.use(new FacebookStrategy({
                    clientID: ".....",
                    clientSecret: ".....",
                    callbackURL: "http://localhost:1337/register/facebook/callback",
                },
                function (accessToken, refreshToken, profile, done) { 
                    process.nextTick(function () {    
                        // here you can access 'req'
                        .......
                    });    
                }
            ));

            isStrategySetup = true;

        }

        next();
    };
}

これを使用すると、検証ハンドラーでリクエストにアクセスできます。

14
ragamufin

passReqToCallbackオプションがあります。詳細については、このページの下部を参照してください。 http://passportjs.org/guide/authorize/

85
Jared Hanson

これを試して。

exports.facebookStrategy = new FacebookStrategy({
        clientID: '.....',
        clientSecret: '...',
        callbackURL: 'http://localhost:3000/auth/facebook/callback',
        passReqToCallback: true
    },function(req,accessToken,refreshToken,profile,done){
        User.findOne({
                'facebook.id' : profile.id
            },function(err,user){
            if(err){
                done(err);
            }
            if(user){
                req.login(user,function(err){
                    if(err){
                        return next(err);
                    }
                    return done(null,user);
                });
            }else{
                var newUser = new User();
                newUser.facebook.id = profile.id;
                newUser.facebook.name = profile.displayName;
                newUser.facebook.token = profile.token;
                newUser.save(function(err){
                    if(err){
                        throw(err);
                    }
                    req.login(newUser,function(err){
                        if(err){
                            return next(err);
                        }
                        return done(null,newUser);
                    });
                });
            }
        });
    }
);

serはマングースモデルです。ユーザーをDBに保存します。

14
NarendraSoni