如何将其他参数传递给passport.authenticate

时间:2017-04-06 21:23:02

标签: node.js express passport.js middleware

(我已经fbStrategy.passReqToCallback = true)我正在匆匆离去 https://scotch.io/tutorials/easy-node-authentication-linking-all-accounts-together但希望将此社交认证服务用于多个应用程序,例如:控制加热系统的应用程序,打开喷头等的应用程序。

基本上,如果其中一个应用程序检查服务器并且没有正确的令牌,则会重定向到此社交身份验证服务(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的{​​{1}}是序列化的用户记录。此时,社交认证并不知道用户是谁。

req,res,next

授权完成后,我想重定向回调用应用程序,我需要fbStrategy.passReqToCallback = true; passport.use(new FacebookStrategy(fbStrategy, function(req, token, refreshToken, profile, done) { var email = (profile.emails[0].value || '').toLowerCase() process.nextTick(function() {... param才能继续前行,以便我可以返回正确的网站。

现在一般情况下,如果我只是将:appId这样的变量设置为可供各种社交状态访问,但是如果你碰巧有多个人同时进行身份验证,那么你可以想象有一个用户返回错误的应用程序,或其他一些用户的应用程序。这就是为什么我需要currentAppId作为参数前往appId。我应该在哪里找出方法。我可以换passport.authenticate或以其他方式修改内容吗?

1 个答案:

答案 0 :(得分:10)

您可以使用请求本身从策略功能传输一些其他参数。在以下示例中,两个参数_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,您可以使用当前请求的套接字作为密钥的映射。