Question

J'utilise Google Login via JS et il apparaît que mon code obtient des données deux fois. Je ne sais pas pourquoi cela se produit.

Quand je clique sur mon bouton "Connexion avec Google", il crache des données (console.log (résultat)) pour l'utilisateur. Ensuite, une invite se produit me demandant de choisir un compte de mien (je suis connecté à plusieurs comptes Google). Lorsque je clique sur le compte, je voudrais, le code recettes à nouveau sur les données de l'utilisateur.

Pourquoi cela se produit-il? C'est un problème car où je crache les données, j'aimerais apporter un appel Ajax pour vérifier l'utilisateur, puis les rediriger. Donc, en substance, il essaie de faire cela deux fois - ce qui n'est pas cool, que se passe-t-il si je ne veux pas vous connecter en utilisant les informations d'identification, Google passe le premier tour?

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

mise à jour: Si je vous déconnecte de tous mes comptes Google (à l'exception d'une seule et unique), l'appel à Google est toujours dupliqué. Cette fois, il se connecte et je vois la console.log () sortie des données deux fois. Les jetons d'accès sont identiques.

update 2: console.log (resp) est émettant deux fois

Mise à jour 3: juste plus de clarification:

Firebug

Était-ce utile?

La solution

Vous rencontrez deux appels vers "console.log (resp);" Dans votre fonction "GoogleCallback" parce que:

La fonction que vous définissez pour votre rappel de connexion sera appelée Chaque fois que le statut signé de l'utilisateur change

Cette citation est prise à partir du "Surveillance de l'état de la session de l'utilisateur"

Comme vous pouvez le constater dans l'article, l'objet de résultat d'autorisation dispose de trois valeurs de «méthode» de statut différent:

Donc, votre code de rappel est déclenché lorsque l'invite de connexion apparaît ("Invite") et lorsque la bannière "Bienvenue Back" apparaît ("auto").

Pour arrêter votre code de rappel de traiter chaque événement de déclenchement, vous pouvez modifier votre code comme suit:

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

Ce code n'appellera que la fonction "gapi.client.oauth2.userinfo.get ()" si un utilisateur est inscrit et que l'événement déclenché le rappel est de type "Invite".

Autres conseils

Google passe toujours par statut 'Invite ", mais par le statut" Auto ", juste lorsque l'utilisateur dispose d'une connexion de succès précédente et qu'il pourrait être automatiquement connecté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top