Node.js 如何向passport.authenticate传递附加参数

Node.js 如何向passport.authenticate传递附加参数,node.js,express,passport.js,middleware,Node.js,Express,Passport.js,Middleware,(我已经做了fbStrategy.passReqToCallback=true)我在偷懒 但是你想在多个应用程序中使用这个社交认证服务,例如:控制供暖系统的应用程序,打开洒水器的应用程序等等 基本上,如果其中一个应用程序与服务器进行了检查,但没有正确的令牌,它将被重定向到此社交身份验证服务(social auth)。当用户按下社交登录按钮时,它会获取其到达的应用程序的参数,并将其添加为/auth/facebook/:appid // send to facebook to do the

(我已经做了
fbStrategy.passReqToCallback=true
)我在偷懒 但是你想在多个应用程序中使用这个社交认证服务,例如:控制供暖系统的应用程序,打开洒水器的应用程序等等

基本上,如果其中一个应用程序与服务器进行了检查,但没有正确的令牌,它将被重定向到此社交身份验证服务(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,res,next的
req
是序列化的用户记录。此时,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
)可以访问各种社会策略,那么它会起作用。但是如果你碰巧有多个人同时进行身份验证,那么你可能会让一个用户返回到错误的应用程序,或者其他用户的应用程序。这就是为什么我需要
appId
作为param旅行到
passport.authenticate
。我应该在哪里找到解决方法。我是否可以包装passport.authenticate
或以其他方式修改内容?

您可以使用请求本身从策略函数和向策略函数传输一些附加参数。在以下示例中,两个参数
\u toParam
\u 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,可以使用当前请求的套接字作为密钥的映射。

Brilliant,非常感谢。我试图通过“当前请求的express中间件套接字”之类的搜索找出你的上一个建议,但没有真正找到任何东西。任何引用都会被欣赏到实际上它不起作用passport.use(新FacebookStrategy(fbStrategy,function(req,token,refreshtToken,profile,done){console.log(req.\u toParam);返回为未定义,即使它在这里定义了..app.get('/auth/facebook/:appId',function(req,res,next){req._toParam=req.params.appId console.log(req._toParam)我读取了错误的日志。对于所有社交身份验证策略,req都被req替换。user@ManfredSteiner我有一个问题,为什么你需要通过(req,res,next)在函数的末尾?它是匿名的吗?当你重定向时,你只需要passport.authenticate(“facebookStrategy”),function(req,req){}…并且你不需要再次传递参数。有什么区别吗?我建议在:{scope:'email',state:“you StringFied data”}中添加状态然后从回调中的req.query.state访问状态