16

Używam Google Login przez JS i wygląda na to, że mój kod pobiera dane dwa razy. Nie jestem pewien, dlaczego tak się dzieje.Google Zaloguj się dwukrotnie?

Po kliknięciu przycisku "Zaloguj się za pomocą Google", wypluwa dane (console.log (result)) dla użytkownika. Następnie pojawia się monit o wybranie mojego konta (jestem zalogowany na kilka kont Google). Gdy kliknę odpowiednie konto, kod ponownie wypisze te dane użytkownika.

Dlaczego tak się dzieje? Jest to problem, ponieważ gdzie wypluć dane, chciałbym wywołać wywołanie ajax, aby zweryfikować użytkownika, a następnie przekierować je. Więc, w istocie, próbuje to zrobić dwa razy - co nie jest fajne, a co jeśli nie chcę się logować za pomocą poświadczeń, google przekazuje za pierwszym razem?

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

Aktualizacja: Gdybym wylogować się ze wszystkich moich kont Google (z wyjątkiem jednego i tylko jednego), wezwanie do Google jest wciąż powielane. Tym razem loguje się i widzę dwa razy dane wyjściowe konsoli.log(). Tokeny dostępu są identyczne.

Aktualizacja 2: console.log (odpowiednio) jest wyprowadzanie dwukrotnie

Update 3: tylko bardziej Wyjaśnienie:

firebug

+0

co widzisz jest emitowany dwa razy? "console.log (resp);" lub "console.log (" Sign-in state: '+ authResult [' error ']); "; Zakładam, że to później? –

+0

console.log (resp); informacje o użytkowniku dwa razy. W moim oryginalnym wpisie najpierw jest to domyślny użytkownik. A następnie informacje użytkownika o wybranym przez siebie akcie. W mojej aktualizacji jest to wartość domyślna dwukrotnie. – Mike

+0

Kiedy postępowałem zgodnie z tutorialem tutaj https://developers.google.com/+/web/signin/javascript-flow, ale użyłem twojego kodu w "gapi.client.load", "console.log (resp);" jest wywoływany tylko raz. –

Odpowiedz

27

napotkania dwa połączenia do „console.log (resp); " w ciągu swojej funkcji „googleCallback”, ponieważ:

funkcji, można zdefiniować do logowania zwrotnego zostanie wywołana za każdym razem, że użytkownik podpisał status zmienia

Ten cytat pochodzi z "Monitoring the user's session state" strona internetowa.

Jak widać w tym artykule, obiekt wynik upoważnienie ma trzy różne stanu wartości "Metoda":

  • zerowe
  • SZYBKA
  • AUTO

Więc kod zwrotna jest wyzwalany, gdy pojawia się monit logowania ("PROMPT") i po pojawieniu się banera "Welcome back" ("AUTO").

Aby zatrzymać swój kod zwrotnej od czynienia z każdego zdarzenia wyzwalającego można zmienić swój kod w następujący sposób:

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']); 
    } 
} 

Kod ten wywoła tylko „gapi.client.oauth2.userinfo.get()” funkcja jeśli użytkownik jest zalogowany, a zdarzenie, które spowodowało wywołanie zwrotne, jest typu "PROMPT".

+0

Widzisz "1" tylko raz w konsoli? [Mine wciąż wyświetla to dwukrotnie] (http://imgur.com/l5QxdME). – Mike

+0

Zaktualizowałem i usunąłem odpowiedź. Patrz wyżej. –

+1

Jesteś świetny. Bardzo doceniane! – Mike

0

Google zawsze przejść przez stan „Wiersz”, ale przez statusu „AUTO” tylko wtedy, gdy użytkownik ma poprzedni sukces logowania i mógł zostać automatycznie zalogować.

Powiązane problemy