16

JS ile Google Giriş kullanıyorum ve kodumun iki kez veri aldığını görüyorum. Bunun neden böyle olduğundan emin değilim.Google Giriş İki kez mi vuruluyor?

"Google ile Oturum Aç" düğmesini tıkladığımda, kullanıcı için tükendiğinde (console.con (sonuç)) veriyi dağıtır. Daha sonra bir hesap seçmemi isteyen bir istemi (birkaç google hesabına giriş yaptım). İstediğim hesabı tıkladığımda, kod o kullanıcı verilerini tekrar tükürür.

Bu neden oluyor? Bu bir problem çünkü verileri tükürdüğümde, kullanıcıyı doğrulamak ve daha sonra yönlendirmek için ajax araması yapmak istiyorum. Yani özünde, bunu iki kez yapmaya çalışıyor - bu pek de iyi değil, ne olursa olsun kimlik bilgilerini kullanarak giriş yapmak istemiyorsam, google ilk dolaşımda geri dönüyor mu?

(function() { 
    var po = document.createElement('script'); 
    po.type = 'text/javascript'; po.async = true; 
    po.src = 'https://apis.google.com/js/client:plusone.js'; 
    var s = document.getElementsByTagName('script')[0]; 
    s.parentNode.insertBefore(po, s); 
})(); 

function googleLogin() { 
    var additionalParams = { 
     'callback': googleCallback 
    }; 

    gapi.auth.signIn(additionalParams); 
} 

function googleCallback(authResult) { 
    if (authResult['status']['signed_in']) { 
     gapi.client.load('oauth2', 'v2', function() { 
      gapi.client.oauth2.userinfo.get().execute(function(resp) { 
       console.log(resp); 
      }) 
     }); 
    } else { 
     console.log('Sign-in state: ' + authResult['error']); 
    } 
} 

Güncelleme: I (bir ve sadece bir tanesi hariç) tüm Google hesaplarının çıkış yaparsanız, google çağrısı hala yineleniyor. Bu sefer oturum açar ve ben konsol.log() verilerini iki kez çıktı olarak görüyorum. Erişim belirteçleri aynıdır.

Güncelleme 2: Sadece daha açıklama:

firebug

+0

iki kez ne outputted olandır mı? "Console.log (sırasıyla);" veya "console.log ('Oturum açma durumu:' + authResult ['error']);"; Sanırım daha sonra mı? –

+0

console.log (resp); kullanıcının bilgisi iki kez. Orijinal gönderiimde, önce varsayılan kullanıcı. Ve sonra seçtikleri accu kullanıcı bilgileri. Güncellememde, varsayılan değeri iki kez. – Mike

+0

https://developers.google.com/+/web/signin/javascript-flow adresindeki eğiticiyi takip ettiğimde ancak kodunuzu "gapi.client.load", "console.log (resp)" içinde kullandığını; sadece bir kez çağrılır. –

cevap

27

İki aramaları için karşılaşıyorsanız "console.log console.log (solunum)

Güncelleme iki kez 3 çıktısı (sırasıyla);" senin "googleCallback" fonksiyonu içinde çünkü:

Eğer için tanımlamak fonksiyonu oturum açma callback'inde statüsünde imzalanan kullanıcının Bu alıntı alınır

değiştiğine dikkat her zaman adı verilecek "Monitoring the user's session state" web sayfası.

  • boş
  • İSTEMİ
  • OTO

Yani geri arama kodu:

adlı makalede de görebileceğiniz gibi

, doğrulama sonuç nesnesi üç farklı durum "yöntemi" değerlere sahip Giriş istemi göründüğünde ("PROMPT") ve "Hoş Geldiniz" başlığı göründüğünde ("AUTO").

function signinCallback(authResult) { 
    if (authResult['status']['signed_in']) { 
     // Update the app to reflect a signed in user 
     // Hide the sign-in button now that the user is authorized, for example: 
     // document.getElementById('signinButton').setAttribute('style', 'display: none'); 

     if (authResult['status']['method'] == 'PROMPT') { 
      console.log(authResult['status']['method']); 

      gapi.client.load('oauth2', 'v2', function() { 
       gapi.client.oauth2.userinfo.get().execute(function (resp) { 
        console.log(resp); 
       }) 
      }); 
     } 
    } else { 
     // Update the app to reflect a signed out user 
     // Possible error values: 
     // "user_signed_out" - User is signed-out 
     // "access_denied" - User denied access to your app 
     // "immediate_failed" - Could not automatically log-in the user 
     console.log('Sign-in state: ' + authResult['error']); 
    } 
} 

Bu kod yalnızca işlev "() gapi.client.oauth2.userinfo.get" arayacak:

şöyle kodunuzu değiştirebilir her tetikleyici olayla ilgili adresinin geri arama kodu durdurmak için Bir kullanıcı oturum açtıysa ve geri bildirimi tetikleyen olay "PROMPT" türünde ise.

+0

Ve konsolda sadece bir kez '1'i görüyor musun? [Benimki hala iki kez gösteriyor] (http://imgur.com/l5QxdME). – Mike

+0

Güncellememi ve yanıtımı sildim. Yukarıyı görmek. –

+1

Harikasınız. Çok takdir! – Mike

0

Google her zaman statü 'İSTEMİ' geçmesi, ancak statü 'OTO' aracılığıyla sadece kullanıcı ve o otomatik bir önceki başarı giriş log olabilir etmiştir.