当部署在多个node.js实例上时,passport.js是否需要会话亲缘关系?

当部署在多个Node.js实例上时,passport.js是否需要会话关联? 在使用会话关联时,身份validation可以在多个实例(在负载均衡器后)正常工作。 我正在使用redis作为会话存储。 但是,在不使用会话关联时,passport.js失败,出现以下错误。 通过一个实例,它总是有效的。 有什么办法让passport.js工作没有会话亲和力。

500 Failed to verify assertion (message: Invalid association handle) at Strategy.authenticate.identifier (node_modules/passport-google/node_modules/passport-openid/lib/passport-openid/strategy.js:184:36) at _verifyAssertionData (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1053:12) at _verifyAssertionAgainstProvider (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1178:14) at _checkSignatureUsingAssociation (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1229:14) at Object.openid.loadAssociation (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:111:5) at _checkSignatureUsingAssociation (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1221:10) at _checkSignature (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1211:5) at _verifyAssertionAgainstProvider (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1174:3) at _verifyDiscoveredInformation node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1145:16) at openid.discover (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:668:7) 

代码片段使用护照:

 app.set('port', process.env.PORT || 8080); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.query()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(express.session({ key: 'JSESSIONID', secret: '****', cookie : {httpOnly:false, maxAge: 5*60*1000, path: '/'}, store: new RedisStore({ prefix: 'sid:', client: redisClient }) })); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); app.get('/auth/google', passport.authenticate('google')); app.get('/auth/google/return', passport.authenticate('google', { successRedirect: '/success', failureRedirect: '/login' })); 

我也有serializeUser和deserializeUser使用redis商店来存储/检索用户对象 – 但是当身份提供商redirect回到URI时,这个错误发生。 我正在AppFog中部署我的应用程序,并使用JSESSIONID Cookie密钥设置会话关联(这就是云平衡负载平衡器的工作原理)。 如果我使用任何其他键(这意味着会话亲和力closures),那么错误是由passport.js抛出。

       

网上收集的解决方案 "当部署在多个node.js实例上时,passport.js是否需要会话亲缘关系?"

我想我已经修好了。 有一个选项:可以传递给GoogleStrategy的“无状态”。 我通过查看源代码find了它: https : //github.com/jaredhanson/passport-openid/blob/master/lib/passport-openid/strategy.js 。 因此GoogleStrategy实例化必须是:

 new GoogleStrategy({ returnURL: BASE + '/auth/google/return', realm: BASE + "/", stateless: true } 

感谢贾里德·汉森实施这样的select! (希望它会在主站点得到logging)。