Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当部署在多个node.js实例上时,passport.js是否需要会话关联_Node.js_Session - Fatal编程技术网

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

当部署在多个node.js实例上时,passport.js是否需要会话关联,node.js,session,Node.js,Session,当部署在多个Node.js实例上时,passport.js是否需要会话关联?当我使用会话亲和力时,身份验证可以在多个实例中正常工作(在负载平衡器后面)。我使用redis作为会话存储。但是,当不使用会话关联时,passport.js将失败,错误如下。对于单个实例,它总是有效的。有没有办法让passport.js在没有会话关联的情况下工作 500 Failed to verify assertion (message: Invalid association handle) at

当部署在多个Node.js实例上时,passport.js是否需要会话关联?当我使用会话亲和力时,身份验证可以在多个实例中正常工作(在负载平衡器后面)。我使用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)
使用passport的代码段:

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 store来存储/检索用户对象,但当身份提供程序重定向回回调URI时,就会发生此错误。我正在AppFog中部署我的应用程序,并使用JSESSIONID cookie键设置会话关联(cloudfoundry负载平衡器就是这样工作的)。如果我使用任何其他键(这意味着会话关联已关闭),则passport.js会抛出错误。

我想我已经修复了它。有一个选项:“无状态”可以传递给GoogleStrategy。我通过查看源代码找到了答案:。因此,GoogleStrategy实例化必须是:

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

感谢Jared Hanson实施了这样一个选项!(希望它能在主站点上得到记录)。

您应该能够在没有关联的情况下运行。我想如果我们能看到你是如何使用redis来存储和共享会话的,那会有所帮助。相关的代码行可能会有所帮助。我已经添加了代码片段以及一些更简要的情况说明。任何帮助都将不胜感激。另一个重要提示:facebook和twitter提供商在没有会话关联的情况下工作良好(他们都使用OAuth)。谷歌认证(OpenID)出现问题。有时它确实可以与谷歌一起工作——但我假设是当原始请求和重定向都由同一个实例处理时。这对Heroku上的multi-dyno应用程序很有帮助。使用Mongo作为会话存储时,我遇到了相同的错误。