在Passport策略回调中获取请求对象

Élo*_*tit 36 node.js passport-facebook passport.js

所以这是我对passport-facebook策略的配置:

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

这是facebookVerificationHandler:

var facebookVerificationHandler = function (accessToken, refreshToken, profile, done) { 
    process.nextTick(function () {    
        .......
    });    
};
Run Code Online (Sandbox Code Playgroud)

有没有办法访问facebookVerificationHandler中的请求对象?

用户通过LocalStrategy注册到我的网站,但随后他们将能够添加他们的社交帐户并将这些帐户与其本地帐户相关联.当调用上面的回调时,当前登录的用户已经在req.user中可用,因此我需要访问req以将用户与facebook帐户相关联.

这是实现它的正确方法还是我应该考虑另一种方法呢?

谢谢.

Jar*_*son 86

有一个passReqToCallback选项,请参阅本页底部了解详情:http://passportjs.org/guide/authorize/

  • 可以很好地将请求对象获取到策略函数,但我无法在数据库回调中使用它(在我的例子中,它是带有 CouchDB 的 nano)。除了回调之外,所有信息都会丢失。您是否知道如何将请求对象传递给这些对象? (2认同)

Nar*_*oni 16

试试这个.

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);
                    });
                });
            }
        });
    }
);
Run Code Online (Sandbox Code Playgroud)

用户是猫鼬模型,我将用户保存在数据库中.

  • 最好的解决方案(因为我没有必要重构每次请求创建FbStratey),谢谢!我认为这应该被标记为正确的答案.回答问题的主要代码 - 如何实际支持在处理函数中获取'req'参数 - 这里是这一部分,添加第4个JSON参数,然后看到你现在可以在函数签名中使用'req'参数: ....**passReqToCallback:true},function(req,accessToken,refreshToken,profile,done){** (3认同)

rag*_*fin 14

因此,不是在应用程序启动时设置策略,而是在有请求时通常设置策略.例如:

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();
    };
}
Run Code Online (Sandbox Code Playgroud)

使用此功能,您将可以在验证处理程序中访问该请求.

  • 另见:http://stackoverflow.com/questions/11784233/using-passportjs-how-does-one-pass-additional-form-fields-to-the-local-authenti (3认同)