2016-01-31 5 views
5

Ich folge Google's guide, um einen Benutzer abzumelden.Wie wird ein Benutzer nach der Seitenaktualisierung abgemeldet?

Bedenkt man, dass gapi.auth2 wird nach dem Aktualisieren der Seite undefiniert sein, ich tue:

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

Aber ich bekomme uncaught exception: This method can only be invoked after the token manager is started im else-Block.

Ich habe auch versucht, die Auth-Instanz im lokalen Speicher zu speichern, aber dies führte zu einigen zyklischen Objektwert Fehler beim Stringifizieren.

Eine posible Lösung ist ein

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

zu tun, sondern stattdessen die Benutzer abzumelden nur meine Anwendung, die alle Google-Dienste auswirken würde, in dem er angemeldet ist, neben einer unerwünschte Umleitung zu tun.

Gibt es einen anderen Ansatz?

+0

ähnliche Frage: [? Wie eine Anwendung Abmelden Wo ich OAuth2 Verwendet mit Google anmelden] (http://stackoverflow.com/questions/12909332/how-to-logout-of-an-application-where-i-used-oauth2-to-login-with-google) – Roberto

Antwort

5

Statt die Singletons für die GoogleAuth Bibliothek des Abrufens und den Client in meiner Anmeldeseite Controller einrichten, hatte ich es in der Datei index.html zu initialisieren:

<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> 

, dass das Abmelde Problem gelöst . Wenn die Anmeldeseite jedoch aktualisiert wurde, wurde die Steuerungslogik ausgeführt, bevor gapi.auth2 definiert wurde und der Click-Handler nicht erfolgreich an die Anmeldeschaltfläche angefügt werden konnte.

Um das zu vermeiden - wenn auch nicht eine elegante Lösung zu sein -, ich $interval verwendet zu warten, bis gapi.auth2 wurde initialisiert:

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: eine weitere mögliche Lösung ist es, ein Versprechen zu verwenden Rückruf für die Controller-Logik, um zu warten, bis das Versprechen gelöst ist, dh bis Google API vollständig geladen ist und gapi.auth2 bereit ist zu verwenden. Es ist posible das zu erreichen, indem Sie:

<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> 

Und dann in der Steuerung:

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

Aber der Nachteil dieses Ansatzes ist, dass es langsamer ist (doppelt so viel Zeit für die Einnahme Click-Handler zum Anhängen) als der erste, der $interval verwendet.

6

gibt es einen einfacheren Weg, man muss nur anrufen .then nach gapi.auth2.init Aufruf

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