Passport.js `isAuthenticated()` 不一致的行为;应该为真时为假

Passport.js `isAuthenticated()` inconsistent behavior; false when it should be true

我正在使用 Passport 允许用户通过 Google 登录。会话存储在 Postgres 中。在我看来,我已经正确配置了所有这些东西。但是,isAuthenticated() 返回的值不一致。

认证成功回调不一致。我已将 passport 配置为在用户成功登录后重定向到 /success

如果服务器刚刚启动(意味着还没有人尝试登录),那么 isAuthenticated() returns true /success 端点。

不过,一旦该用户注销,如果他们重新登录,则 isAuthenticated() returns false/success 路由上。如果他们刷新页面,那么它 returns true.

/logout 端点的行为也不一致。有时它第一次有效,而有时用户需要刷新。

我看过人们遇到的类似问题。特别是,两个最常见的问题在这里似乎不是这样:

  1. CORS 已设置 (SO answer / my code)
  2. 我的中间件的顺序似乎是正确的(SO answer / my code)
  3. logIn 不相关,因为我没有放置自定义回调 (SO Answer)
  4. 序列化工作正常;它只是在某些情况下不会被调用 (SO question / explanation in here; session isn't finding su)

在过去的几个小时里,我一直在逐步检查 Passport 源代码以试图弄清楚这一点。有关我所发现内容的更多信息,请参阅此处 on the Passport repo.

这个正在进行的项目是开源的。中间件正在这里配置:

https://github.com/jmeas/finance-app/blob/google-sign-in/server/app.js

Passport 配置可以在这里看到:

https://github.com/jmeas/finance-app/blob/google-sign-in/server/utils/configure-passport.js

也许我遗漏了一些明显的东西?

tl;dr 是您需要在某些浏览器中手动调用保存(例如 Chrome)。他们不会在重定向之前等待整个响应。

更多信息,请参阅:

https://github.com/expressjs/session/issues/309#issuecomment-230594298

和相关问题。我在那里非常彻底地浏览了所有内容。