在我们的ExpressJS应用程序中,当推送到 生产环境 服务器时,护照会话会随机混淆 . 随机,即使我没有退出会话,页面也可以加载另一个用户的视图 . 没有做任何其他事情,另一次刷新会让我回到我自己的帐户(也随机) .
这种现象发生在我们的两个Web应用程序中,这些应用程序由两个独立用户按照其网站上的Passport指南进行编码 . 这两个网络应用都使用Facebook connect / API .
这在Redis和File会话存储上都会发生 . 我看到a post about using global variables:我们确定我们只使用本地范围 .
有什么我们做错了吗?
更新v1
在一个应用程序中,我们为Passport的序列化/反序列化实现了以下内容:
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
另一方面,我们也尝试过:
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
User
.where({id: user.id})
.fetch()
.then(function (user) {
done(null, user);
}, function (err) {
done(err, user);
});
});
无论哪种方式,应用仍然会使其会话混乱 .
Update v2 仅当多个用户登录到服务器并同时使用时才会发生此错误 . 只有1个人使用该系统时不会发生这种情况 .
Update v3 似乎问题可能是由亚马逊AWS引起的,因为一些"wrong user"页面请求根本没有到达NodeJS应用程序(由 console.log
验证) .
1 回答
问题似乎是由ExpressJS引起的缓存,而不是PassportJS会话 .
我们发现ExpressJS在 生产环境 模式下将设置
view cache
设置为true . 通过在app.js中使用app.disable('view cache');
,我们禁用了缓存,似乎已经解决了问题 .