(我已经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
或以其他方式修改内容吗?
答案 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,您可以使用当前请求的套接字作为密钥的映射。