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


84

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

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

现在,我需要在我的应用程序中单击一个按钮的同时从Google登出该用户。如何使用JavaScript实现此功能,或者至少在用户每次登录时都必须询问Google登录页面。

我已经尝试过approval_prompt=force,但是似乎没有用。

Answers:


244

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

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

“您是Google,这个Vinesh伙计声称他是vinesh.e@gmail.com,是真的吗?”

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

“等待一秒钟的堆栈溢出,我将验证这个家伙,如果他可以为自己的Google帐户输入正确的密码,那就是他。”

输入Google密码后,Google会告诉Stack Overflow您是您的真实身份,然后Stack Overflow登录。

当你注销您的应用程序,你的记录了您的应用程序:

这是刚接触OAuth的开发人员有时会感到困惑的地方... Google和Stack Overflow,Assembla,Vinesh的“非常酷-光滑-webapp”都是不同的实体,而Google对Vinesh凉爽的webapp上的帐户一无所知,反之反之亦然,除了用于访问个人资料信息的API公开的内容外。

当您的用户注销时,他或她没有从Google注销,他/她正在注销您的应用程序,Stack Overflow或Assembla或任何使用Google OAuth进行身份验证的Web应用程序。

实际上,我可以注销所有Google帐户,但仍可以登录Stack Overflow。一旦您的应用知道用户是谁,该人便可以退出Google。不再需要Google。

话虽如此,您要执行的操作是将用户从真正不属于您的服务中注销。像这样思考:作为用户,如果我用自己的Google帐户登录5种不同的服务,您会感到多么烦恼,那么当我第一次注销其中之一时,我必须登录到我的Gmail帐户再次因为那个应用程序开发人员决定,当我注销他的应用程序时,我也应该注销Google吗?这真的会很快变老。简而言之,您真的不想这样做...

是的,无论如何,我仍然想从Google登出该用户,只是告诉我该怎么做?

话虽如此,如果您仍然希望将用户从Google登出,并意识到您很可能会破坏他们的工作流程,则可以从其Google服务的一个注销按钮动态构建注销网址,然后使用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时,它确实开始使人们感到愤怒,因此我们停止了将他们从Google登出。:)


8
感谢您的宝贵时间和这么大的说明。但是我的客户有不同的意见。假设用户使用他的Google登录名从公共系统登录到应用程序,然后从应用程序注销。他可能认为他也已经从Google注销,但实际上不是!以后使用该系统的任何其他用户都可以访问该Google帐户。
Vinesh EG 2012年

13
然后,您的用户也需要退出Google。关键是,他们正在登录2个服务。您的用户需要学习如何使用OAuth。:)我建议教育您的客户和用户。如果需要,请继续进行演示。无需花费太长时间即可实施,然后在意识到有多糟糕时撤消。:)我一直不相信自己,直到我真正做到这一点,并看到每次我退出LoopToDo都必须重新登录Google才能获得多少PITA。考虑一下消息“您已退出Vinesh的炫酷应用程序,别忘了>也退出Google <!”。
jmort253 2012年

1
@ jmort253是的,我知道他们不再需要提供权限,但是我应该如何再次对其进行身份验证?请参阅我提出的这个问题(我仍然不
熟悉

1
@ jmort253但是,如果对用户而言,“断开连接”一词意味着完全退出应用程序。用户想知道我刚刚断开连接后会发生什么,它不应该包含我的信息,并且第二个用户将无法登录到另一个帐户,因为它将始终自动登录,除非auth提供程序提供了强制登录方法。因此,在这种情况下,需要注销,以便注销cookie,而您不必再担心在客户端如何对其进行管理。
darewreck

1
这对于用户使用Google登录的电子应用程序很有用!在这种情况下,将其从Google中注销只会将它们从一个应用程序(Electron应用程序)中注销。
trusktr

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";
}

1
最后!谢谢!我一直在尝试了一整天找如何注销,以避免在未来用户登录,通过只需点击前面的用户,不知道电子邮件或密码......
一些

1
它不工作,因为它足够在另一个选项卡中打开同一个页面,而你再次登录...
巴特洛梅耶Semańczyk

5

对我来说,它有效(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中调用此函数


2
尽管这确实是可行的,但问题实际上是在询问JavaScript,而不是Java。
jmort253

2
这听起来很奇怪,您需要的只是一个令牌,您可以用蛮力将Google强制注销每个人。
Archimedes Trajano 2014年

它不会从设备中注销您,只会注销应用程序(在android中)。
维诺伊·约翰·霍桑

2
通过查看一些google oauth2文档,典型的访问令牌看起来像这样。“ 1 / fFAGRNJru1FTz70BzhT3Zg”假设“ 1 /”部分只是为了让人类更容易识别数字。您仍然有两个字母(大写和小写)以及十个长度为22个字符的数字。那是22 ^(26 * 2 + 10)等于1.6990502e + 83。或关于已知宇宙中原子数目。祝您好运蛮横在HTTP上强制执行。;)
Chris Balogh,2016年

这似乎并未撤消刷新令牌,刷新令牌可能会在删除Cookie之前被窃取(如果存储在此处)。
OndrejGalbavý16年


1

这可以使用户退出应用程序,但不能退出Google。

var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
  console.log('User signed out.');
});

来源:https//developers.google.com/identity/sign-in/web/sign-in


1
这不会完全从用户的Google帐户注销用户。它只会破坏AuthInstance您使用过的。您的消息来源本身说:“您可以使用户无需退出Google即可退出您的应用……
Roshana Pitigala

@RoshanaPitigala更新了答案以指定。该答案是问题标题的答案,但是,一旦您更详细地阅读了该问题,便会理解标题写得不正确。此答案适用于根据问题标题在此处完成的任何人。
CamHart

1

Ouath只会使Google实例为null,因此您就离开了Google。现在就是架构的制作方式。从Google注销,如果您注销应用程序是一项肮脏的工作,但如果要求相同则无济于事。因此,将以下内容添加到您的signOut()函数中。我的项目是Angular 6应用程序:

document.location.href =“ https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://localhost:4200 ”;

这里localhost:4200是我的应用程序的URL。如果您的登录页面是xyz.com,请输入该页面。


1

此代码可以退出

    <script>
      function signOut() 
      {
        var auth2 = gapi.auth2.getAuthInstance();
        auth2.signOut().then(function () {   
        console.log('User signed out.');   
        auth2.disconnect();   
      }); 
        auth2.disconnect();
      } 
    </script>

1

要仅从应用程序而不是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代码中使用了上面的代码。


0

我希望我们可以通过在登录时将令牌存储在会话中并在他单击注销时访问令牌来实现此目的。

    String _accessToken=(String)session.getAttribute("ACCESS_TOKEN");
    if(_accessToken!=null)
    {
        StringBuffer path=httpRequest.getRequestURL();
        reDirectPage="https://www.google.com/accounts/Logout?
        continue=https://appengine.google.com/_ah/logout?
        continue="+path;
    }
    response.sendRedirect(reDirectPage);

0

看来Google最近在其撤销的资料上发生了一些变化(它开始为我们返回400个错误)。您现在必须打电话

auth2.disconnect();

在我们的情况下,我们必须等待几秒钟才能完成断开连接调用,否则登录代码将在完成之前重新授权。如果谷歌从断开连接方法返回了一个承诺,那将是一个很好的选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.