Google api auth2 signOut не работает
Во-первых, я следую этому руководству 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()
, он просто этого не делает.
Я заметил, что sessionStorage для accounts.google.com по-прежнему существует, и из-за этого 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();
Ответы
Ответ 1
Я попытался следующим образом, и это сработало. Требуется вызвать auth2.disconnect()
при auth2.signOut()
завершении 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>
Ответ 2
Может случиться так, что объект auth2 не загружен.
(что вызовет обе проблемы, представленные в вопросе).
Этот следующий фрагмент устраняет эту конкретную проблему.
if(!gapi.auth2){
gapi.load('auth2', function() {
gapi.auth2.init();
});
}