如何让Google停止在PassportJS中自动登录用户?

时间:2015-07-23 20:24:36

标签: javascript node.js oauth google-oauth passport.js

我只允许用户使用某个域名登录。此特定功能有效,而不是问题的根源。问题是,当用户尝试使用不正确的电子邮件地址登录时,会陷入某种负面反馈循环。

Image describing the login process visually

参考上图,用户(在没有信息的空白隐身页面中)从第一步开始。单击登录会将他们带到第二步,然后再到第3步。尝试使用以错误域名结尾的电子邮件地址登录会使他们进入第4步。这是理想的。

在第四步之后,如果他们退出网站,则会显示第一步。这是可取的。注销的代码如下。

app.get("/logout", function(req, res) {
    req.logout()
    req.session.destroy()
    res.clearCookie("connect.sid")
    res.redirect("/")
})

点击登录再次后会发生什么是不受欢迎的。它没有将它们带回到第2步(希望,所以他们可以使用他们的CORRECT电子邮件地址再次登录),而是将它们直接带到第4步。就好像Google记得最后登录的是谁

这是code for my passport.js configuration file

简短问题:我如何向Google发出不要这样做的信号?或者触发浏览器允许他们再次登录?我很茫然。

额外详细信息:在Oauth2.0 Documentation for Google中,它提到了hd和realm,它可以限制登录到某个域。但我不知道如何在PassportJS配置文件中配置它。

2 个答案:

答案 0 :(得分:8)

我认为你想要的是提示用户选择他们的帐户。与我回答的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声明。

答案 1 :(得分:1)

如果您对所使用的电子邮件不满意,可以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