Pregunta

Estoy usando el inicio de sesión de Google a través de JS y parece que mi código está obteniendo datos dos veces. No estoy seguro de por qué está ocurriendo esto.

Cuando haga clic en el botón "Iniciar sesión con Google", escupe (console.log (resultado)) datos para el usuario. Luego se produce un mensaje pidiéndome que elija una cuenta mía (he iniciado sesión en varias cuentas de Google). Cuando haga clic en la cuenta que me gustaría, el código luego escupe ese usuario de nuevo.

¿Por qué está ocurriendo esto? Es un problema porque a donde escupí los datos, me gustaría hacer una llamada AJAX para verificar al usuario y luego redirigirlos. Entonces, en esencia, está tratando de hacerlo dos veces, lo que no es genial, ¿qué pasa si no quiero iniciar sesión con las credenciales que Google pasa a la primera vuelta?

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

Actualizar: Si me muestra fuera de todas mis cuentas de Google (con la excepción de una y solo una), la llamada a Google todavía está duplicada. Esta vez inicia sesión y veo console.log () que sale de datos dos veces. Los tokens de acceso son idénticos.

update 2: console.log (resp) se envía dos veces

Actualización 3: Sólo más aclaraciones:

firebug

¿Fue útil?

Solución

Usted está encontrando dos llamadas a "console.log (resp)"; dentro de su función "Googlecallback" porque:

La función que usted define para su devolución de llamada de inicio de sesión será llamada Cada vez que el usuario firmado en el estado cambia

Esta cita se toma de la "Monitoreo del estado de la sesión del usuario" página web.

Como puede ver en el artículo, el objeto de resultados de autorización tiene tres valores de "método" de estado diferente:

Por lo tanto, su código de devolución de llamada se está activando cuando aparece el indicador de inicio de sesión ("PROMPT") y cuando aparezca el banner "Bienvenido Back" ("AUTO").

Para detener su código de devolución de llamada Tratar con cada evento de activación, podría cambiar su código de la siguiente manera:

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

Este código solo llamará a la función "gapi.client.outh2.userinfo.get ()" si se inicia un usuario y el evento que activó la devolución de llamada es de tipo "PROMPT".

Otros consejos

Google SIEMPRE Vaya a través del estado 'PRÁGIMO', pero a través del estado 'AUTO' ", cuando el usuario tiene un inicio de sesión de éxito anterior y podría iniciar sesión automáticamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top