【问题标题】:Google api auth2 signOut not workingGoogle api auth2 signOut 不起作用
【发布时间】:2015-12-29 16:59:06
【问题描述】:

首先,我正在关注本指南https://developers.google.com/identity/sign-in/web/ 和此参考https://developers.google.com/identity/sign-in/web/reference

但是我没有在window 中声明回调,而是使用gapi.signin2.render 函数来呈现按钮并在我的Angular 控制器中附加一个处理程序。

登录工作正常,问题是,当我尝试通过调用gapi.auth2.getAuthInstance().signOut() 注销时,它就是不这样做。

我注意到 account.google.com 的 sessionStorage 仍然存在,因此当我在登录屏幕上再次呈现该按钮时,Google 会自动让我重新登录。

我试着看看signOut() 完成后会发生什么:

gapi.auth2.getAuthInstance().signOut().then(function() {
    console.log(gapi.auth2.getAuthInstance().isSignedIn.get());
    // prints 'true'
});

我还尝试调用disconnect() 而不是signOut(),知道它会撤消访问权限,并且确实会从 sessionStorage 中删除令牌,但用户会话仍然存在。只有在我重新加载页面后它才会消失。

这是我的完整代码:

$scope.logout = function() {
    //...
    gapi.auth2.getAuthInstance().signOut().then(function() {
      console.log(gapi.auth2.getAuthInstance().isSignedIn);
    });
};

$scope.processAuth = function(authResult) {
  console.log("success");
  if(authResult.getAuthResponse().id_token) {
    // backend calls
  }
};

$scope.renderSignInButton = function() {
  console.log(gapi.auth2);
  gapi.signin2.render('signInButton',
    {
      'onsuccess': $scope.processAuth, // Function handling the callback.
      'onfailure': $scope.signinFailed, // Function handling the callback.
      'clientid': 'asdasdasd.apps.googleusercontent.com',
      'scope': 'https://www.googleapis.com/auth/userinfo.email',
      'cookiepolicy': 'single_host_origin'
    }
  );
};

$scope.renderSignInButton();

【问题讨论】:

  • 我有和你一样的情况,(一个有 codeigniter、Angular 和谷歌登录的网站)但我在删除访问权限时没有问题。当您说您的用户会话仍然存在时,您是指您网站的自定义会话还是谷歌的身份验证实例?这是我的代码,工作正常function googleSignOut() { var auth2 = gapi.auth2.getAuthInstance(); auth2.signOut().then(function () { myPostToDeleteMySiteSession() ;}); auth2.disconnect(); }

标签: javascript angularjs google-api google-api-client


【解决方案1】:

我尝试了以下方法并且成功了。 auth2.signOut()成功时需要调用auth2.disconnect()

<script type="text/javascript">
    function signOut() {
        var auth2 = gapi.auth2.getAuthInstance();
        auth2.signOut().then(function () {
            auth2.disconnect();
        });

    }

    function onLoad() {
        gapi.load('auth2', function() {
            gapi.auth2.init();
        });
    }
</script>



<script src="https://apis.google.com/js/platform.js?onload=onLoad" async defer></script>

【讨论】:

  • auth2.disconnect();为我工作!谢谢!
  • 先生,我试过了,但在第二次登录帐户列表未打开?
【解决方案2】:

可能会发生未加载 auth2 对象的情况。 (这将导致问题中提出的两个问题)。

以下 sn-p 解决了该特定问题。

 if(!gapi.auth2){
    gapi.load('auth2', function() {
        gapi.auth2.init();
    });
 }

【讨论】:

    【解决方案3】:

    对我来说,问题只出在 chrome 中,因为只有一种配置文件模式。 个人资料模式意味着您只连接了一个帐户,为了查看您需要连接到多个帐户的帐户列表,但是在个人资料模式打开的情况下,您只连接了一个帐户,因此没有列表显示 -只有一个帐户。

    当您连接到列表 2 google 帐户时,在 firefox 上进行测试,您将在 chrome 中看到配置文件模式的列表或存在(但我不知道如何做到这一点,我在 chrome 中以配置文件模式堆叠瞬间)

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 1970-01-01
      • 2021-03-03
      • 2018-03-22
      • 2012-06-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      相关资源
      最近更新 更多