Pergunta

Estou usando o Login do Google via JS e parece que meu código está obtendo dados duas vezes.Não sei por que isso está ocorrendo.

Quando clico no botão "Login com Google", ele exibe (console.log(result)) dados para o usuário.ENTÃO ocorre um prompt solicitando que eu escolha uma conta minha (estou logado em várias contas do Google).Quando clico na conta desejada, o código exibe os dados do usuário novamente.

Por que isso está ocorrendo?É um problema porque onde eu cuspo os dados, gostaria de fazer uma chamada ajax para verificar o usuário e depois redirecioná-lo.Então, em essência, ele está tentando fazer isso duas vezes - o que não é legal, e se eu não quiser fazer login usando as credenciais que o Google passa na primeira tentativa?

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

Atualizar: Se eu sair de todas as minhas contas do Google (com exceção de uma e apenas uma), a chamada para o Google ainda será duplicada.Desta vez, ele efetua login e vejo console.log() gerando dados duas vezes.Os tokens de acesso são idênticos.

Atualização 2: console.log(resp) está gerando duas vezes

Atualização 3: Apenas mais esclarecimentos:

firebug

Foi útil?

Solução

Você está encontrando duas chamadas para "Console.log (resp);" dentro da sua função "GoogleCallback" porque:

A função que você definir para o seu retorno de chamada de login será chamada toda vez que o usuário assinou alterações de status

Esta citação foi retirada do "Monitorando o estado da sessão do usuário" página da Internet.

Como você pode ver no artigo, o objeto de resultado da autorização possui três valores de "método" de status diferentes:

  • nulo
  • INCITAR
  • AUTO

Portanto, seu código de retorno de chamada será acionado quando o prompt de login aparecer ("PROMPT") e quando o banner "Bem-vindo de volta" aparecer ("AUTO").

Para impedir que seu código de retorno de chamada lide com cada evento acionador, você pode alterar seu código da seguinte maneira:

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 só chamará a função "gapi.client.oauth2.userinfo.get()" se um usuário estiver conectado e o evento que acionou o retorno de chamada for do tipo "PROMPT".

Outras dicas

Google sempre passa pelo status 'prompt', mas através do status 'auto' apenas quando o usuário possui um login anterior de sucesso e ele pode ser automaticamente efetuado logon.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top