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