16

Sto utilizzando Google Login tramite JS e sembra che il mio codice riceva i dati due volte. Non sono sicuro del motivo per cui ciò si sta verificando.Google Login che colpisce due volte?

Quando faccio clic sul mio pulsante "Accedi con Google", sputa (dati console.log (risultato)) per l'utente. ALLORA si verifica un prompt che mi chiede di scegliere un mio account (ho effettuato l'accesso a diversi account Google). Quando faccio clic sull'account che desidero, il codice sputa di nuovo i dati dell'utente.

Perché si verifica? È un problema perché quando sputo fuori i dati, mi piacerebbe fare una chiamata ajax per verificare l'utente e quindi reindirizzarli. Quindi, in sostanza, si sta provando a farlo due volte - il che non è figo, cosa succede se non voglio accedere utilizzando le credenziali che google restituisce al primo tentativo?

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

Aggiornamento: Se i dati di login di tutti i miei account Google (ad eccezione di una e una sola), la chiamata a Google è ancora duplicato. Questa volta effettua l'accesso e vedo console.log() che emette i dati due volte. I token di accesso sono identici.

Aggiornamento 2: console.log (resp) è l'output due volte

Update 3: Basta maggiori chiarimenti:

firebug

+0

Cosa vedi in fase di uscita due volte? "Console.log (rispettivamente);" o "console.log ('Stato accesso:' + authResult ['error']);"; Suppongo sia il dopo? –

+0

console.log (resp); le informazioni dell'utente due volte. Nel mio post originale, è l'utente predefinito per primo. E poi le informazioni sull'utente dell'acct che selezionano. Nel mio aggiornamento, è il valore predefinito due volte. – Mike

+0

Quando ho seguito il tutorial qui https://developers.google.com/+/web/signin/javascript-flow ma ho usato il tuo codice all'interno di "gapi.client.load", "console.log (resp);" è chiamato solo una volta. –

risposta

27

si verificano due chiamate a "console.log (resp);" all'interno la funzione "googleCallback", perché:

La funzione che si definisce per il vostro segno-in callback verrà chiamata ogni volta che l'utente firmato a stato cambia

Questa citazione è presa dalla "Monitoring the user's session state" pagina web.

Come si può vedere in questo articolo, l'oggetto risultato autorizzazione ha tre diversi valori di stato "Metodo":

  • nulli
  • PRONTA
  • AUTO

Così il vostro codice di callback viene attivato quando viene visualizzato il prompt di accesso ("PROMPT") e quando viene visualizzato il banner "Bentornato" ("AUTO").

Per interrompere il codice di richiamata da trattare con ogni evento di trigger è possibile modificare il codice come segue:

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

Questo codice sarà solo chiamare la "gapi.client.oauth2.userinfo.get) (" la funzione se un utente è registrato e l'evento che ha attivato la richiamata è di tipo "PROMPT".

+0

E vedi "1" solo una volta in console? [Il mio è ancora visualizzato due volte] (http://imgur.com/l5QxdME). – Mike

+0

Ho aggiornato e non cancellato la mia risposta. Vedi sopra. –

+1

Sei fantastico. Molto apprezzato! – Mike

0

Google passare sempre attraverso lo status 'PRONTA', ma attraverso lo stato di 'AUTO' solo quando l'utente ha un precedente login successo e poteva essere il login automaticamente.

Problemi correlati