16

Ich benutze Google Login via JS und es scheint, dass mein Code Daten zweimal erhält. Ich bin nicht sicher, warum das passiert.Google-Anmeldung zweimal tippen?

Wenn ich auf meine Schaltfläche "Mit Google anmelden" klicke, werden Daten (console.log (Ergebnis)) für den Benutzer ausgegeben. DANN erscheint eine Aufforderung, mich zu bitten, ein Konto von mir zu wählen (ich bin bei mehreren Google-Konten angemeldet). Wenn ich auf das Konto klicke, das ich möchte, spuckt der Code diese Benutzerdaten erneut aus.

Warum tritt das auf? Es ist ein Problem, denn wo ich die Daten ausspucke, möchte ich einen Ajax-Anruf machen, um den Benutzer zu verifizieren und dann umzuleiten. Also im Wesentlichen versucht es das zweimal - was nicht cool ist, wenn ich mich nicht mit den Zugangsdaten einloggen möchte, die Google beim ersten Mal zurückgibt?

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

Update: Wenn ich aus allen meinen Google-Konten anmelden (mit Ausnahme von einem und nur einem), wird der Anruf zum Google noch dupliziert. Dieses Mal meldet es sich an und ich sehe console.log() Daten zweimal ausgeben. Zugriffstoken sind identisch.

Update 2: console.log (bzw.) ausgibt zweimal

Update 3: Nur mehr Klarheit:

firebug

+0

Was halten Sie zweimal ausgegeben sehen werden? "console.log (resp);" oder "console.log ('Anmeldezustand:' + authResult ['error']);"; Ich nehme an, es ist das spätere? –

+0

console.log (resp); die Benutzerinformationen zweimal. In meinem ursprünglichen Beitrag ist es der Standardbenutzer zuerst. Und dann die Benutzerinformationen des ausgewählten acct. In meinem Update ist es der Standardwert zweimal. – Mike

+0

Als ich das Tutorial hier https://developers.google.com/+/web/signin/javascript-flow verfolgt habe, aber deinen Code in "gapi.client.load", "console.log (resp)" verwendet habe wird nur einmal aufgerufen. –

Antwort

27

Sie stoßen zwei Anrufe „console.log (bzw);" in Ihrem „googleCallback“ -Funktion, weil:

Die Funktion, die Sie für Ihre Anmelde-Callback definieren jedes Mal aufgerufen werden, dass der in Status unterzeichnete der Benutzer ändert, wird

Dieses Zitat aus dem genommen "Monitoring the user's session state" Webseite.

Wie Sie in dem Artikel sehen können, hat die Berechtigung Ergebnis Objekt drei verschiedene Status "Methode" Werte:

  • null
  • PROMPT
  • AUTO

So Ihr Rückruf-Code wird ausgelöst, wenn die Anmeldeaufforderung erscheint ("PROMPT") und wenn das Banner "Willkommen zurück" erscheint ("AUTO").

Um Ihren Rückruf-Code aus dem Umgang mit jedem Triggerereignis stoppen Sie Ihren Code wie folgt ändern könnte:

die „gapi.client.oauth2.userinfo.get()“ Dieser Code
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']); 
    } 
} 

nur anrufen Funktion wenn ein Benutzer angemeldet ist und das Ereignis, das den Rückruf ausgelöst hat, vom Typ "PROMPT" ist.

+0

Und Sie sehen "1" nur einmal in der Konsole? [Mine zeigt es immer noch zweimal an] (http://imgur.com/l5QxdME). – Mike

+0

Ich habe meine Antwort aktualisiert und gelöscht. Siehe oben. –

+1

Sie sind fantastisch. Sehr geschätzt! – Mike

0

Google immer durch Status gehen ‚PROMPT‘, sondern durch Status ‚AUTO‘ nur, wenn der Benutzer ein früherer Erfolg Login hat und er automatisch eingeloggt werden.