Comment utiliser correctement la bibliothèque JavaScript JavaScript de Google
-
21-12-2019 - |
Question
J'essaie d'accéder à certaines API Google de mon client JavaScript à l'aide de OAuth2.J'ai réussi à obtenir l'utilisateur d'authentifier les demandes, mais il y a un comportement inattendu lors de l'exécution du code ci-dessous que j'aimerais comprendre.Lorsque je clique sur le bouton "Autoriser" la première fois, le résultat est:
'[{"ERROR": {"Code": 401, "Message": "Login requis", "Données": [{"Domaine": "Global", "Raison": "Obligatoire"":" Connexion requise "," EmplacementType ":" Header "," Lieu ":" Autorisation "}]}," ID ":" gapirpc "}] '
sur le deuxième clic Le résultat est
[{"id": "gapirpc", "résultat": {"id": "1115793426680xxxx", "e-mail": "xxxxx@gmail.com", "Verified_email": true}}]
Voici le code de la page que je teste
<div id='sign in'>
<button onclick="init();">Authorize</button>
</div>
<p id="output">hello</p>
<script type="text/javascript">
function init() {
document.getElementById('output').innerHTML='loading oauth2 api'
gapi.client.load('oauth2', 'v2', auth);
}
function auth() {
var config = {
client_id: '2264xxxxx-odt0g7jn8vspa3ot9ogjxxxxxxxxx.apps.googleusercontent.com',
scope: 'https://www.googleapis.com/auth/userinfo.email',
immediate:true
};
document.getElementById('output').innerHTML='authorizing'
gapi.auth.authorize(config, authed());
}
function authed() {
document.getElementById('output').innerHTML='authorized'
var request = gapi.client.oauth2.userinfo.get().execute(
function(resp, raw) {
document.getElementById('output').innerHTML=raw
}
);
}
</script>
<script src="https://apis.google.com/js/client.js"></script>
<!--<script src="https://apis.google.com/js/client.js?onload=init"></script>-->
Pourriez-vous s'il vous plaît expliquer pourquoi je recevrais une "connexion requise" lors de la première exécution du code et une authentification réussie sur la deuxième exécution?
La solution
En raison des parenthèses immédiatement après "Authed" dans l'appel à Gapi.Auth.authorize, le rappel autorisé () est exécuté immédiatement, avant l'appel à Gapi.Auth.authorize.
Aussi, dans votre gestionnaire autorisé (), vous devez vérifier si le chèque d'autorisation avec immédiat: vrai a réussi; Pour plus de détails, voir la documentation de référence ici:
Reportez-vous également à la section sur le blocage pop-up ici:
Lorsque l'autorisation "immédiate" échoue, le rappel autorisé sera invoqué avec un objet de jeton NULL ou un objet de jeton contenant une "erreur"; Dans ces cas, vous devez présenter un élément d'interface utilisateur que l'utilisateur peut cliquer sur lequel vous réexécutera la réexécution de l'appel de Gapi.Auth.Authorize mais avec «Immédiat» défini sur False (ou omis). Cela permet d'ouvrir la fenêtre contextuelle de l'autorisation sans courir au bloqueur pop-up de votre navigateur.