如何让 Google 停止在 PassportJS 中自动登录用户?
Posted
技术标签:
【中文标题】如何让 Google 停止在 PassportJS 中自动登录用户?【英文标题】:How to make Google stop logging user in automatically in PassportJS? 【发布时间】:2015-10-14 08:23:00 【问题描述】:我只允许用户使用某个域名登录。此特定功能有效,不是问题的根源。问题是当用户尝试使用错误的电子邮件地址登录时,他们会陷入一种负面反馈循环。
参考上图,用户(在没有信息的空白隐身页面中)从第一步开始。单击登录会将他们带到第 2 步,然后到第 3 步。尝试使用以错误域结尾的电子邮件地址登录会将他们带到第 4 步。这是需要的。
在第四步之后,如果他们退出网站,则会看到第一步。这是可取的。退出的代码如下。
app.get("/logout", function(req, res)
req.logout()
req.session.destroy()
res.clearCookie("connect.sid")
res.redirect("/")
)
他们再次点击登录后发生的事情是不可取的。不是让他们回到第 2 步(希望他们可以使用正确的电子邮件地址再次登录),而是让他们直接进入第 4 步。 就好像 Google 正在记住谁最后登录.
这里是code for my passport.js configuration file。
简短问题:我如何向 Google 发出信号不要这样做?还是触发浏览器让他们重新登录?我很茫然。
额外细节:在Oauth2.0 Documentation for Google中,提到了hd和realm,可以限制登录到某个域。但我不知道如何在 PassportJS 配置文件中进行配置。
【问题讨论】:
有点感觉 google 不应该不这样做。如果用户已登录,则不应要求他们再次登录。这里真正的问题是你从用户那里得到的电子邮件地址并不总是相同的,所以如果他们改变了他们登录的帐户并转到你的应用程序,他们将被发送到第 4 步。不完全确定该建议什么。 我在 github 上的代码链接在问题中。你觉得可以看看吗?我已经研究了将近一个星期,但无法弄清楚。似乎,由于用户已经通过身份验证并登录到谷歌,它根本不会要求他们再次登录,而是在谷歌被要求进行身份验证时自动登录。我不知道在这种情况下该怎么办。你会如何设计这个系统? 这样的事情一定很常见。如果另一个应用程序中的用户想要注销然后使用不同的电子邮件重新登录,但仍在同一浏览器中使用 Google 身份验证,该怎么办?我不知道如何做到这一点。 这不会很常见,因为根据电子邮件地址域限制访问并不常见。 我 2 美分的价值在于,这绝对是 Google 的问题。 Google 需要在自己的实施中解决此问题。 【参考方案1】:我认为您想要的是提示用户选择他们的帐户。与我回答的previous question 类似的情况。这样用户就可以清楚地选择他们希望使用的帐户,即使他们之前已经登录过。
在您的授权请求中添加参数prompt=select_account
。
app.get(
"/auth/google",
passport.authenticate(
"google",
scope : ["profile", "email"],
prompt : "select_account" // Added here
)
)
这将导致始终显示帐户选择器,即使用户只登录了一个帐户。用户将能够从他们的帐户中进行选择,或添加一个新帐户。
例如:https://accounts.google.com/o/oauth2/auth?redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&response_type=code&client_id=407408718192.apps.googleusercontent.com&scope=profile+email&access_type=offline&prompt=select_account
此外,如果您希望基于域限制访问,并且该域是 Google Apps for Work 域,那么执行此操作的最正确方法是检查 ID 令牌中的 hd
参数。 How to process the ID Token,然后提取 hd
声明。
【讨论】:
我认为这是正确的答案,我赞成(感谢有关prompt
参数的提示)。我打算留下我的答案,作为参考,以防有人想要撤销他们的令牌。
如何在节点中添加这个参数?我这样做了,它似乎没有工作。 gist.github.com/Connorelsea/162f1e3d27b0440bff06
我在域通过身份验证后检查域,它正在工作,但它导致用户无法再次登录,除非他们已经有多个帐户喜欢他们的谷歌帐户。 Google 只是自动让他们登录。
我想做的是让他们在他们注销后显示第 2 步,而不是显示第 4 步。如果这有意义的话。
天哪!我将它添加到正确的位置并且它有效。谢谢你们,威廉和西莫,非常感谢你们的帮助。我已经尝试解决这个问题一个多星期了。【参考方案2】:
如果您对使用的电子邮件不满意,您可以在您的终端上revoke 令牌。您必须另外提出一个请求,才能撤销该帐户对您的 OAuth 应用的访问令牌。
在您的路由回调中执行此代码(使用request
模块的示例):
request.get('https://accounts.google.com/o/oauth2/revoke',
qs:token:'[ACCESS or REFRESH TOKEN]'
, function (err, res, body)
)
之后,用户将在随后的登录尝试中再次收到提示。
如果您希望每次都提示用户登录,请查看@William Denniss 的answer。
【讨论】:
这两个答案都非常有帮助。非常感谢你们。以上是关于如何让 Google 停止在 PassportJS 中自动登录用户?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 passportjs 中的刷新令牌中获取新的 Google oauth 访问令牌
PassportJs Google Auth 将现有用户保存为数据库中的新用户。我该如何解决?
如何使passportjs google login oauth与JWT一起使用,而不是通过序列化/反序列化方法创建会话?
如何更新passportjs设置的req.user会话对象?
在 React/Express 中使用 PassportJS 进行 Google OAuth 时出现 CORS 错误
invalid_request with missing: 在 Google Oauth2 上使用 Google Passportjs 的范围