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

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

本文关键字:真的 isAuthenticated js 不一致 Passport      更新时间:2023-09-26

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

这种不一致发生在身份验证的成功回调中。我已经将passport配置为当用户成功登录时重定向到/success

如果服务器刚刚启动(意味着还没有人尝试登录),则isAuthenticated()会为/success端点返回true

然而,一旦该用户注销,如果他们重新登录,则isAuthenticated()/success路由上返回false。如果刷新页面,则返回true

/logout端点的操作也不一致。有时它第一次工作,而在其他时候用户需要刷新。

我看过人们遇到的类似问题。特别是,两个最常见的问题似乎并非如此:

  1. CORS已设置(SO答案/我的代码)
  2. 我的中间件的顺序似乎是正确的(SO答案/我的代码)
  3. logIn不相关,因为我没有放置自定义回调(SO Answer)
  4. 序列化工作正确;它只是在某些情况下不会被调用(此处为SO问题/解释;session找不到su

在过去的几个小时里,我一直在浏览Passport源代码,试图弄清楚这一点。关于我发现的更多信息,可以在这里的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)中手动调用save。他们不会在重定向之前等待整个响应。

有关更多信息,请参阅:

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

以及相关问题。我把那里的一切都看得很透彻。