2016-01-31 29 views
5

Bir kullanıcıyı kapatmak için Google's guide takip ediyorum.Sayfa yenileme işleminden sonra nasıl oturum açılır?

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

Ama başka bloğunda uncaught exception: This method can only be invoked after the token manager is started olsun:

gapi.auth2 sayfayı yeniledikten sonra, benim yaptığım tanımsız olacağını düşünürsek.

Ayrıca, auth örneğini yerel depolama biriminde depolamayı denedim, ancak bunu gerçekleştirirken bazı döngüsel nesne değeri hatalarına yol açtı.

Bir doktorunun bir çözümün kendisi istenmeyen bir yönlendirmeyi yapıyor yanı sıra açmış olduğu tüm Google'ın hizmetlerini etkili olacağına dikkat, yerine tek çıkış başvurumun kullanıcının oturumunu ki, ama bir

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

yapmaktır.

Farklı bir yaklaşım var mı?

+0

Benzer soru: [? Google'dan ile giriş için OAuth2 kullanılmış bir Uygulama Çıkış yap Nasıl] (http://stackoverflow.com/questions/12909332/how-to-logout-of-an-application-where-i-used-oauth2-to-login-with-google) – Roberto

cevap

5

yerine GoogleAuth kütüphane için singleton alınırken ve benim oturum açma sayfası denetleyicisi müşteriyi kurma, ben index.html dosyasında başlatmak zorunda kaldı: çıkış sorunu çözdü

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

. Ancak, oturum açma sayfası yenilendiyse, denetleyici mantığı, gapi.auth2 tanımlanmadan önce yürütülür ve tıklama işleyicisini, oturum açma düğmesinin başarıyla eklenmesi mümkün olmaz. zarif bir çözüm olmadığı gerçi - - önlemek amacıyla

, beklemek $interval kullanılan gapi.auth2 başlatıldı sonu:

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

DÜZENLEME: başka olası çözüm söz kullanmaktır denetleyici mantığının geri çağrılması, söz konusu karar çözülene kadar beklemek, yani Google API tamamen yüklenene ve gapi.auth2 kullanıma hazır olana kadar.

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

Sonra denetleyicisi: (iki kat fazla zaman ayırdığınız

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

Fakat, bu yaklaşımın olumsuz yavaş olmasıdır O yaparak elde için posible $interval'u kullanarak ilk eklenenden daha fazla)

6

bir kolay bir yolu, sadece gapi.auth2.init çağrıldıktan sonra .o aramak zorunda olduğunu

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