首先,我正在遵循本指南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()
注销时,它只是没有这样做。
我注意到accounts.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();
答案 0 :(得分:2)
我尝试了以下方法,并且有效。 auth2.disconnect()
成功后,必须调用auth2.signOut()
。
<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>
答案 1 :(得分:1)
可能会发生未加载auth2对象的情况。 (这将导致问题中出现的两个问题)。
以下代码段解决了这个特定问题。
if(!gapi.auth2){
gapi.load('auth2', function() {
gapi.auth2.init();
});
}