94

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

4

12 回答 12

272

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's-very-cool-slick-webapp 都是不同的实体,Google 对您在 Vinesh 很酷的 webapp 上的帐户一无所知,反之亦然反之亦然,除了通过您用来访问个人资料信息的 API 公开的内容。

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

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

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

是的,无论如何,我仍然想将用户从 Google 中注销,请告诉我该怎么做?

话虽如此,如果您仍然想将用户从 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 时,它​​确实开始让人们生气,因此我们停止了将他们从 Google 中注销。:)

于 2012-10-16T07:28:36.630 回答
23

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

var logout = function() {
    document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://www.example.com";
}
于 2016-09-15T12:59:41.573 回答
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
}

您必须在 android 的 AsyncTask 中调用此函数

于 2014-04-23T13:32:16.743 回答
2

这可以让用户退出应用程序,但不能让 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

于 2017-04-02T09:42:25.000 回答
2

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

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

只需在您的网站上切换您的网站

于 2018-01-12T14:24:27.387 回答
2

仅退出应用程序而不退出 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 代码中使用了上面的内容。

于 2019-12-25T14:15:01.893 回答
1

Ouath 只是让谷歌实例为空,因此你离开了谷歌。现在这就是架构的制作方式。退出谷歌,如果你退出你的应用程序是一项肮脏的工作,但如果要求规定相同,则无济于事。因此,将以下内容添加到您的 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,请输入。

于 2018-09-09T17:52:21.877 回答
1

此代码将用于退出

    <script>
      function signOut() 
      {
        var auth2 = gapi.auth2.getAuthInstance();
        auth2.signOut().then(function () {   
        console.log('User signed out.');   
        auth2.disconnect();   
      }); 
        auth2.disconnect();
      } 
    </script>
于 2018-09-26T06:30:10.920 回答
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);
于 2018-01-17T10:03:52.913 回答
0

看起来谷歌最近用他们的撤销东西破坏了一些东西(它开始为我们返回 400 个错误)。你现在必须打电话

auth2.disconnect();

在我们的例子中,我们必须等待几秒钟以完成断开连接调用,否则登录代码将在完成之前重新授权。如果谷歌从断开方法返回一个承诺会很好。

于 2019-09-17T03:26:50.000 回答
0

如果有人想要它在 Java 中,这是我的答案,为此你必须调用另一个线程。

于 2020-12-17T12:03:48.690 回答
0
1. Try this code, if you are using onSignIn() function
2.
        <script src="https://apis.google.com/js/platform.js?onload=onLoad" async defer></script>
       <script>
       function signOut() {
       onLoad();
       var auth2 = gapi.auth2.getAuthInstance();
       auth2.signOut().then(function () {
       console.log('User signed out.');
       if(auth2.isSignedIn)
       {
          auth2.isSignedIn.set(false);
       }
       });
       }
       function onLoad() {
          gapi.load('auth2', function() {
            gapi.auth2.init();
          });
        }
        </script>
于 2021-05-13T19:23:27.227 回答