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

mck*_*imo 13 middleware node.js express passport.js

(我已经这样做了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);
    });
Run Code Online (Sandbox Code Playgroud)

reqreq,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() {...
Run Code Online (Sandbox Code Playgroud)

一旦授权完成,我想重定向回调用应用程序,我需要参加这个:appId参数,所以我可以回到正确的网站.

现在一般情况下,如果我只是创建了一个变量,currentAppId可以访问各种社交状态,但如果您碰巧有多个人同时进行身份验证,那么您可能会让用户返回错误的应用程序,或其他一些用户应用程序.这就是为什么我需要appId作为param旅行passport.authenticate.我应该在哪里找出方法.我能包装passport.authenticate或以其他方式修改东西吗?

Man*_*ner 12

您可以使用请求本身从策略功能传输一些其他参数.在下面的例子中的两个参数_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() {...
Run Code Online (Sandbox Code Playgroud)

如果您需要存储id以进一步请求,您可以使用当前请求的套接字作为键的映射.

  • 实际上它没有工作passport.use(新的FacebookStrategy(fbStrategy,函数(req,token,refreshToken,profile,done){console.log(req._toParam);即使在这里定义,也会返回undefined .. app .get('/ auth/facebook /:appId',function(req,res,next){req._toParam = req.params.appId console.log(req._toParam)我正在读错了日志. (2认同)
  • 我建议添加状态:{scope:'email',state:"you stringyfied data"}然后在回调中从req.query.state访问状态 (2认同)