Google Login frappe deux fois?
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']);
}
}
update 2: console.log (resp) est émettant deux fois
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"
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é.