在我们的 ExpressJS 应用程序中,当推送到生产服务器时,护照会话会随机混淆。即使我没有退出会话,该页面也可以随机加载另一个用户的视图。不做任何其他事情,另一次刷新将使我回到我自己的帐户(也是随机的)。
这种现象发生在我们的两个 Web 应用程序上,这些应用程序由两个不同的用户按照他们网站上的 Passport 指南编写。两个网络应用程序都使用 Facebook 连接/API。
这发生在 Redis 和 File 会话存储上。我看到了一篇关于使用全局变量的帖子:我们确定我们只使用局部范围。
我们做错了什么吗?
更新 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);
});
});
无论哪种方式,该应用程序仍然会混淆其会话。
更新 v2 仅当多个用户登录到服务器并同时使用时才会发生此错误。只有 1 人使用该系统时不会发生这种情况。
更新 v3
似乎问题可能是由 Amazon AWS 引起的,因为一些“错误用户”页面请求根本没有到达 NodeJS 应用程序(由 验证console.log
)。