2016-01-31 9 views
5

Я следую за Google's guide, чтобы выписать пользователя.Как вывести пользователя после обновления страницы?

Учитывая, что gapi.auth2 будет определено после обновления страницы, я делаю:

if (gapi.auth2) { 
    var auth2 = gapi.auth2.getAuthInstance(); 
    auth2.signOut(); 
} else { 
    gapi.load('auth2', function() { 
     gapi.auth2.init({ 
      client_id: 'myAppID', 
      cookiepolicy: 'single_host_origin' 
     }).signOut(); 
    }); 
} 

Но я получаю в блоке еще uncaught exception: This method can only be invoked after the token manager is started.

Я также попытался сохранить экземпляр auth в локальном хранилище, но это привело к некоторым ошибкам значения циклического объекта при его подстановке.

Одно решение Возможное это сделать

document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=myUrl"; 

, но, вместо того, чтобы регистрировать пользователей только моего приложения, которые будут влиять на все услуги Google, в котором он регистрируемые, к тому же делает нежелательное перенаправление.

Есть ли другой подход?

+0

Похожий вопрос: [? Как Выход из приложения, где я использовал oauth2 Войти с помощью Google] (http://stackoverflow.com/questions/12909332/how-to-logout-of-an-application-where-i-used-oauth2-to-login-with-google) – Roberto

ответ

5

Вместо извлечения синглтона для библиотеки GoogleAuth и настройки клиента в моем входе в системе контроллера страниц, я должен инициализировать его в файле index.html:

<script src="https://apis.google.com/js/api:client.js?onload=start" async defer></script> 
<script> 
    function start() { 
     gapi.load('auth2', function() { 
     auth2 = gapi.auth2.init({ 
      client_id: 'myAppID', 
      cookiepolicy: 'single_host_origin' 
     }); 
     }); 
    } 
</script> 

Это решило проблему выхода из системы , Однако, если страница входа в систему была обновлена, ее логика контроллера будет выполнена до того, как будет определена gapi.auth2, и было бы нецелесообразно успешно присоединить обработчик кликов к кнопке входа.

Для того, чтобы избежать этого, - хотя и не является элегантным решением - я использовал $interval ждать, пока gapi.auth2 не был инициализирован:

waitForAuth2Initialization = $interval(function() { 
    console.log("Checking..."); 
    if (!gapi.auth2) 
     return; 
    console.log("Ok, gapi.auth2 is not undefined anymore"); 
    var auth2 = gapi.auth2.getAuthInstance(); 
    // Attach signin 
    auth2.attachClickHandler... 

    $interval.cancel(waitForAuth2Initialization); 
}, 50); 

EDIT: Другое возможным решением является использование обещания callback для логики контроллера дождаться разрешения обещания, то есть до тех пор, пока API Google не будет полностью загружен и gapi.auth2 готов к использованию. Это Возможное добиться того, что, выполнив:

<script src="https://apis.google.com/js/api:client.js?onload=start" async defer></script> 
<script> 
    gapiPromise = (function() { 
     var deferred = $.Deferred(); 
     window.start = function() { 
      deferred.resolve(gapi); 
     }; 
     return deferred.promise(); 
    }()); 
    auth2Promise = gapiPromise.then(function() { 
     var deferred = $.Deferred(); 
     gapi.load('auth2', function() { 
      auth2 = gapi.auth2.init({ 
       client_id: 'myAppID', 
       cookiepolicy: 'single_host_origin' 
      }).then(function() { 
       deferred.resolve(gapi.auth2); 
      }); 
     }); 
     return deferred.promise(); 
    }); 
</script> 

А затем в контроллере:

auth2Promise.then(function() { 
    console.log("Ok, gapi.auth2 is not undefined anymore"); 
    var auth2 = gapi.auth2.getAuthInstance(); 
    // Attach signin 
    auth2.attachClickHandler... 
}); 

Но недостатком этого подхода является то, что он медленнее (с в два раза больше времени для клик для прикрепления), чем первый, используя $interval.

6

есть более простой способ, вам просто нужно позвонить .then после вызова gapi.auth2.init

gapi.load('auth2', function() { 
    var auth2 = gapi.auth2.init({ 
     client_id: 'myAppID', 
     cookiepolicy: 'single_host_origin' 
    }); 
    auth2.then(function(){ 
     // this get called right after token manager is started 
     auth2.signOut(); 
    }); 
}); 
Смежные вопросы