如何注销我使用OAuth2登录谷歌的应用程序?

Vin*_* EG 79 javascript api oauth-2.0

在我的应用程序中,我使用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,但似乎没有工作.

jmo*_*253 219

OAuth概述:他/她是否说他/她的用户是谁?:

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

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

如果您已经登录,Google会说YES.如果没有,Google会说:

"等一下Stack Overflow,我会对这个家伙进行身份验证,如果他能为他的Google帐户输入正确的密码,那么就是他".

当您输入Google密码时,Google会告诉Stack Overflow您是谁,并且Stack Overflow会将您登录.

当你注销您的应用程序,你登出您的应用程序:

以下是OAuth新手的开发人员有时会感到困惑...谷歌和Stack Overflow,Assembla,Vinesh的非常酷的网络应用程序,都是不同的实体,谷歌对Vinesh酷炫的webapp上的帐户一无所知.反之,除了您通过API公开的内容,您还可以使用它来访问个人资料信息.

当您的用户退出时,他/她不会退出Google,他/她正在退出您的应用,Stack Overflow或Assembla,或使用Google OAuth对用户进行身份验证的任何Web应用程序.

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

说到这一点,你要做的就是将用户从真正不属于你的服务中注销.想想这样:作为一个用户,如果我使用我的Google帐户登录5种不同的服务,您认为我会是多么恼火,那么当我第一次退出其中一项服务时,我必须登录我的Gmail帐户再次,因为该应用程序开发人员决定,当我退出他的应用程序时,我也应该退出Google?那会很快变老.总之,你真的不想这样做 ......

Yeh yeh,无论如何,我仍然希望将用户退出Google,只需告诉我该怎么做?

话虽如此,如果您仍然希望将用户从Google注销,并意识到您可能正在破坏其工作流程,则可以从其中一个Google服务注销按钮动态构建注销网址,然后使用一个img元素或一个脚本标记:

<script type="text/javascript" 
    src="https://mail.google.com/mail/u/0/?logout&hl=en" />
Run Code Online (Sandbox Code Playgroud)

要么

<img src="https://mail.google.com/mail/u/0/?logout&hl=en" />
Run Code Online (Sandbox Code Playgroud)

要么

window.location = "https://mail.google.com/mail/u/0/?logout&hl=en";
Run Code Online (Sandbox Code Playgroud)

如果您将用户重定向到注销页面,或者从非跨域限制的元素调用它,则该用户将从Google注销.

请注意,这并不一定意味着用户将退出您的应用程序,只有Google.:)

摘要:

请记住,重要的是,当您注销应用程序时,您无需让用户重新输入密码.这就是重点!它对Google进行身份验证,因此用户无需在他或她使用的每个Web应用程序中反复输入密码.需要一些时间来习惯,但要知道,只要用户登录Google,您的应用就不必担心用户是否是他/她所说的人.

我使用与OAuth一起使用的Google个人资料信息,在项目中实现了相同的功能.我尝试了同样的尝试,当他们不得不一次又一次地登录谷歌时,它真的开始让人生气,所以我们停止将它们从谷歌中删除.:)

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

小智 21

您可以退出并重定向到您的网站:

var logout = function() {
    document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://www.example.com";
}
Run Code Online (Sandbox Code Playgroud)

  • 这会从所有网站注销您的所有谷歌帐户 (3认同)

Vin*_*san 6

对我来说,它的工作原理(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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然这确实有用,但问题实际上是询问JavaScript,而不是Java. (2认同)
  • 你所需要的只是一个令牌,这听起来很奇怪,你可以蛮力谷歌强行注销每个人。 (2认同)
  • 通过查看某些[google oauth2 docs](https://developers.google.com/identity/protocols/OAuth2InstalledApp),典型的访问令牌如下所示."1/fFAGRNJru1FTz70BzhT3Zg"假设"1 /"部分仅供人类识别数字更容易.您仍然有两个字母(大写和小写)加上十个数字,长度为22个字符.这是22 ^(26*2 + 10),等于1.6990502e + 83.或者关于[已知宇宙中的原子数](https://en.wikipedia.org/wiki/Observable_universe#Matter_content).祝你好运通过HTTP强行推出.;) (2认同)