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();
    });
 }