PassportJS 会话混淆了

Posted

技术标签:

【中文标题】PassportJS 会话混淆了【英文标题】:PassportJS Session Mixed Up 【发布时间】:2015-11-25 07:01:06 【问题描述】:

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

这种现象发生在我们的两个 Web 应用程序上,这些应用程序由两个不同的用户按照他们网站上的 Passport 指南编写。两个网络应用都使用 Facebook 连接/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);
    );
);

无论哪种方式,应用程序仍然会混淆其会话。

更新 v2 仅当多个用户登录到服务器并同时使用时才会发生此错误。只有 1 人使用系统时不会发生。

更新 v3 看起来问题可能是由 Amazon AWS 引起的,因为一些“错误用户”页面请求根本没有到达 NodeJS 应用程序(由console.log 验证)。

【问题讨论】:

你如何序列化/反序列化用户?每个请求都来自客户端,其 user 属性设置为您在注册会话时序列化用户的任何内容。 感谢@Purag,我已经用我们的序列化/反序列化代码更新了这个问题。两者都可以在各地的工作示例中找到。 应用程序没有使用app.locals,而应该使用res.locals,是否有任何机会? @robertklep - 不,我们要么只使用res.locals,要么根本不使用它。 req.user 提供的用户与预期不同。 【参考方案1】:

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

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

【讨论】:

Simply click the bounty award icon next to each answer to permanently award your bounty to the answerer. (You cannot award a bounty to your own answer.) 写在bounty doc 400 代表去了空白空间.. gah :( express 和 passport 共享同一个会话。所以我仍然不明白为什么缓存会在你的情况下导致问题。

以上是关于PassportJS 会话混淆了的主要内容,如果未能解决你的问题,请参考以下文章

没有会话的 Passport js 身份验证

带有猫鼬的 PassportJS 只发送一半的数据

Passport js 无法跨域维护会话

PassportJS - 自定义回调并将 Session 设置为 false

通过令牌进行身份验证,如果令牌失败,则通过会话进行身份验证,使用 Passport?

Passportjs Facebook 登录流程(passport-facebook vs passport-token)