如何注销使用 OAuth2 登录 Google 的应用程序?

IT技术 javascript api oauth-2.0
2021-02-10 18:57:03

在我的应用程序中,我使用 jsapi 实现了 Google 注销。

我使用网址https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx连接到 Google,然后使用https://www.googleapis.com/plus/v1/people/xxxxxx获取用户数据来自谷歌个人资料。

现在,我需要在单击应用程序中的按钮时从 Google 注销用户。我如何在 JavaScript 中实现这一点,或者至少每次用户登录时它都必须询问 Google 登录页面。

我试过了approval_prompt=force,但似乎不起作用。

6个回答

OAuth 概述:用户是他/她所说的他/她吗?:

我不确定您是否使用 OAuth 登录 Stack Overflow,例如“使用 Google 登录”选项,但是当您使用此功能时,Stack Overflow 只是询问 Google 是否知道您是谁:

“哟谷歌,这个 Vinesh 家伙声称 vinesh.e@gmail.com 是他,这是真的吗?”

如果您已经登录,Google 会说“是”。如果没有,谷歌会说:

“等一下 Stack Overflow,我会验证这个家伙的身份,如果他可以为他的 Google 帐户输入正确的密码,那么就是他”。

当你输入你的谷歌密码时,谷歌会告诉 Stack Overflow 你就是你所说的那个人,然后 Stack Overflow 会让你登录。

当您退出您的应用程序时,您将退出您的应用程序:

在这里,OAuth 的新开发人员有时会感到有些困惑……Google 和 Stack Overflow、Assembla、Vinesh 的非常酷的 webapp 都是不同的实体,而 Google 对您在 Vinesh 的酷 web 应用上的帐户一无所知,反之亦然反之亦然,除了通过您用来访问个人资料信息的 API 公开的内容。

当您的用户退出时,他或她并不是在退出 Google,而是在退出您的应用程序、Stack Overflow、Assembla 或任何使用 Google OAuth 对用户进行身份验证的 Web 应用程序。

事实上,我可以退出我所有的 Google 帐户,但仍然可以登录 Stack Overflow。一旦您的应用知道用户是谁,该用户就可以退出 Google。不再需要谷歌。

话虽如此,您要求做的是将用户从真正不属于您的服务中注销。可以这样想:作为用户,如果我使用 Google 帐户登录 5 个不同的服务,您认为我会有多生气,然后我第一次退出其中一个服务时,我必须登录我的 Gmail 帐户还是因为那个应用程序开发人员决定,当我退出他的应用程序时,我也应该退出谷歌?那真的会老得很快。总之,你真的不想这样做......

嗯嗯,不管怎样,我还是想把用户从谷歌注销,告诉我我该怎么做?

话虽如此,如果您仍然希望将用户从 Google 注销,并意识到您很可能会破坏他们的工作流程,您可以从他们的 Google 服务注销按钮之一动态构建注销 URL,然后使用一个 img 元素或一个脚本标签:

<script type="text/javascript" 
    src="https://mail.google.com/mail/u/0/?logout&hl=en" />

或者

<img src="https://mail.google.com/mail/u/0/?logout&hl=en" />

或者

window.location = "https://mail.google.com/mail/u/0/?logout&hl=en";

如果您将用户重定向到注销页面,或从不受跨域限制的元素调用它,用户将从 Google 注销。

请注意,这并不一定意味着用户将从您的应用程序中注销,只有 Google才会注销:)

概括:

重要的是要记住,当您退出应用程序时,您不需要让用户重新输入密码。这就是重点!它针对 Google 进行身份验证,因此用户不必在他或她使用的每个 Web 应用程序中一遍又一遍地输入他或她的密码。这需要一些时间来适应,但要知道,只要用户登录 Google,您的应用程序就无需担心用户是否是他/她所说的那个人。

我在一个项目中与您有相同的实现,使用带有 OAuth 的 Google 个人资料信息。我尝试了你想要尝试的同样的事情,当人们不得不一遍又一遍地登录谷歌时,它真的开始让人们生气,所以我们停止将他们从谷歌中注销。:)

我正在使用 Google OAuth 开发混合移动应用程序 (Ionic) 并且遇到了同样的问题,因为我想使用不同的 Google 帐户登录,但我总是自动登录。目前我正在向帐户发出 JSONP 异步请求。 google.com/logout以注销用户,但这是一个“肮脏”的技巧,并向控制台吐出错误,但找不到任何其他可行的解决方案。如果有人知道更好的方法,请告诉我。我没有将用户从其他服务注销的问题,因为它是包含在 Web 视图中的混合移动应用程序。
2021-03-14 18:57:03
@jmort253 是的,我知道他们不再需要提供权限,但是我应该如何再次验证它们?请参阅我提出的这个问题(我还是 OAuth 的新手):stackoverflow.com/questions/37515836/...
2021-03-17 18:57:03
@jmort253 但是,如果对用户来说“断开连接”这个词意味着完全退出应用程序。因为它会自动重新登录而不再次输入凭据,所以有两个问题;用户想知道发生了什么我刚刚断开连接,它不应该有我的信息,第二个用户将无法登录其他帐户,因为除非身份验证提供程序提供强制登录方法,否则它将始终自动登录。所以在这种情况下,注销是可取的,这样它可以使 cookie 无效,并且您不再需要担心它在客户端是如何管理的。
2021-03-30 18:57:03
感谢您的宝贵时间和如此大的描述。但我的客户有不同的看法。假设用户使用他的 google 登录从公共系统登录到应用程序并从应用程序注销。他可能认为他也从谷歌登出,但实际上并没有!以后使用该系统的任何其他用户都可以访问 google 帐户。
2021-03-31 18:57:03
然后您的用户也需要退出 Google。关键是,他们正在登录 2 个服务。您的用户需要学习如何使用 OAuth。:) 我建议教育您的客户和用户。如果必须,请继续向他们展示。实施应该不会花很长时间,然后当您意识到它有多糟糕时再撤消。:) 我自己都不相信,直到我真正做到了这一点,并看到每次我退出 LoopToDo 时都必须重新登录 Google 有多少 PITA。考虑一条消息“您已退出 Vinesh 的酷应用,不要忘记 > 退出 Google 了<!”
2021-04-04 18:57:03

您可以注销并重定向到您的站点:

var logout = function() {
    document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://www.example.com";
}
不行,因为在另一个标签页打开同一个页面就够了,你又重新登录了...
2021-03-15 18:57:03
是的,它有效,但有谷歌警告页面表明我们将被重定向到...
2021-03-30 18:57:03
最后!谢谢!我一整天都在努力寻找如何注销,以防止下一个用户通过单击以前一个用户的身份登录,而无需知道电子邮件或密码......
2021-04-04 18:57:03
谢谢。我多年来一直在寻找这个。
2021-04-07 18:57:03

对我来说,它有效(java - android)

void RevokeAcess()
{
    try{
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/revoke?token="+ACCESS_TOKEN);
    org.apache.http.HttpResponse response = client.execute(post);
    }
    catch(IOException e)
    {
    }
    CookieManager.getInstance().removeAllCookie(); // this is clear the cookies which tends to same user in android web view
}

你必须在android的AsyncTask中调用这个函数

通过查看一些google oauth2 文档,典型的访问令牌如下所示。“1/fFAGRNJru1FTz70BzhT3Zg” 假设“1/”部分只是为了让人类更容易识别数字。您仍然有两个字母(大写和小写)加上十个长度为 22 个字符的数字。那是 22^(26*2+10) 等于 1.6990502e+83。或者关于已知宇宙中的原子数量祝你好运,通过 HTTP 强制执行。;)
2021-03-13 18:57:03
它不会从设备上注销您,它只会注销应用程序(在 android 中)。
2021-03-14 18:57:03
你只需要一个令牌,这听起来很奇怪,你可以蛮力谷歌强行注销每个人。
2021-03-16 18:57:03
虽然这确实可行,但问题实际上是在问 JavaScript,而不是 Java。
2021-03-25 18:57:03
这似乎不会撤销刷新令牌,它可能会在删除 cookie 之前被盗(如果它存储在那里)。
2021-03-30 18:57:03

您可以简单地创建一个注销按钮并将此链接添加到它,它会最终将您从应用程序中注销并重定向到您想要的站点:

https://appengine.google.com/_ah/logout?continue=http://www.YOURSITE.com

只需将您的网站与您的网站切换

要仅从应用程序而不是 Gmail 中退出,请执行以下操作:

window.gapi.load('auth2', () => {
      window.gapi.auth2
        .init({
          client_id:
            '<Your client id configired on google console>'
        })
        .then(() => {
          window.gapi.auth2
            .getAuthInstance()
            .signOut()
            .then(function() {
              console.log('User signed out.');
            });
        });
    });

我在我的 ReactJs 代码中使用了上面的内容。

效果很好!特别是如果您在gapi不再可用的页面上,那么这实际上是初始化和注销。
2021-04-11 18:57:03