如何传递一个额外的参数passport.authenticate

(我已经做了fbStrategy.passReqToCallback = true )我fbStrategy.passReqToCallback = true https://scotch.io/tutorials/easy-node-authentication-linking-all-accounts-together,但想要使用这个社交authentication服务的多个应用程序,前:控制加热系统,打开喷头等

基本上,如果这些应用程序之一检查服务器,并没有一个正确的令牌,它会被redirect到这个社会authentication服务(社会authentication)。 当用户按下社交loginbutton时,它抓取它到达的应用程序的参数,并将其添加为/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 req,res,next是序列化的用户logging。 此时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这样的variables用于各种社会状态,那么它就可以工作,但是如果你碰巧有多个人在同一时间进行身份validation,那么你可以想象有一个用户返回到错误的应用程序或其他用户的应用程序。 这就是为什么我需要appId作为参数passport.authenticate 。 我应该在哪里找出如何。 我可以包裹passport.authenticate吗?validation或修改的东西吗?

您可以使用请求本身从策略函数传递一些额外的参数。 在下面的例子中,两个参数_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存储为进一步的请求,则可以使用当前请求的套接字作为关键字的映射。