PassportJS 会话混淆

PassportJS Session Mixed Up

在我们的 ExpressJS 应用程序中,当推送到生产服务器时,护照会话会随机混淆。随机地,即使我没有退出我的会话,该页面也可以加载另一个用户的视图。不执行任何其他操作,再次刷新将使我回到我自己的帐户(也是随机的)。

我们的两个 Web 应用程序正在发生这种现象,这些应用程序由两个不同的用户按照其网站上的 Passport 指南进行编码。两个网络应用程序都使用 Facebook connect/API.

这发生在 Redis 和文件会话存储上。我看到 a post about using global variables:我们确定我们只使用本地范围。

我们做错了什么吗?

更新 v1

在一个应用程序中,我们为 Passport 的 serialize/deserialize 实现了以下内容:

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 看来这个问题可能是由亚马​​逊 AWS 引起的,因为一些“错误的用户”页面请求根本没有到达 NodeJS 应用程序(由 console.log 验证)。

问题似乎是由 ExpressJS 而不是 PassportJS 会话引起的缓存。

我们发现 ExpressJS 在生产环境中将设置 view cache 设置为 true。通过在 app.js 中使用 app.disable('view cache');,我们禁用了缓存,似乎已经解决了问题。