web-dev-qa-db-fra.com

Comportement étrange du jeton OAuth2.0 (informations d'identification non valides 401)

Habituellement, le mécanisme de Google OAuth2.0 fonctionne très bien.

  1. L'utilisateur confirme l'autorisation d'accéder au compte Google avec les étendues sélectionnées.
  2. Le jeton d'actualisation est récupéré et enregistré dans un stockage de longue durée.
  3. Chaque fois que nécessaire (si le jeton d'accès a expiré), le jeton d'accès est récupéré et utilisé pour accéder aux API.

Mais parfois (jusqu'à présent seulement deux fois depuis plus de 6 mois), j'ai rencontré un comportement étrange:

Les demandes adressées aux API Google renvoient une erreur d'informations d'identification invalides (401). L'actualisation du jeton d'accès (à l'aide du jeton d'actualisation stocké) n'aide pas.

Voici quelques résultats structurés que j'ai obtenus lors du test de ce problème:

 + -------------------------------------------- ----------------------------- + 
 | ESSAYER DE RAFRAÎCHIR LE JETON. | 
 | 2.FRE RAFRAÎCHISSANT LE JETON. | 
 + ------------------------------------------- ------------------------------ + 
 | accès:           ************************************************ **** | 
 | rafraîchir: ********************************************* | 
 | expire: 3600 | 
 | créé: 2013-07-23 13:12:36 | 
 + -------------------------------------------- ----------------------------- + 

J'ai également essayé de vérifier le jeton d'accès "frais" en envoyant des demandes à https://www.googleapis.com/oauth2/v1/tokeninfo

 + -------------------------------------------- ----------------------------- + 
 | 1. ESSAYEZ DE VÉRIFIER LE JETON. | 
 | 2. FAIT VÉRIFIER LE JETON LE JETON. | 
 + ------------------------------------------- ------------------------------ + 
 | issu_to: ************. apps.googleusercontent.com | 
 | public: ************. apps.googleusercontent.com | 
 | user_id: ************ | 
 | expires_in: 3600 | 
 | e-mail: **********@gmail.com | 
 | email_vérifié: 1 | 
 | access_type: hors ligne | 
 | étendues :: | 
 + ---------------------------------------- --------------------------------- + 
 | https://www.googleapis.com/auth/userinfo.email | 
 | https://www.googleapis.com/auth/userinfo.profile | 
 | https://www.googleapis.com/auth/plus.me | 
 | https://www.googleapis.com/auth/drive | 
 + ------------------------------ ------------------------------------------- + 

Mais lorsque j'essaie d'accéder au flux d'entraînement, la réponse est:

 Erreur lors de l'appel à GET https://www.googleapis.com/drive/v2/files (401) Informations d'identification non valides 
 
 Domaine: global 
 Raison: authError 
 message: Informations d'identification non valides 
 locationType: en-tête 
 emplacement: Autorisation 

Nous avons également rencontré le même problème avec les calendriers. Alors:

  1. Le jeton était valide avant (tout fonctionnait).
  2. Le jeton rafraîchissant fonctionne toujours.
  3. La demande d'un flux répond par une erreur "Informations d'identification non valides".
  4. Tous les autres jetons fonctionnent toujours très bien, ce qui signifie que le code est valide.

Normalement, lorsque le jeton est révoqué, une erreur "invalid_grant" est renvoyée lors de la tentative d'actualisation du jeton.

Questions

  1. Quelle peut être la raison de ce comportement? Si le jeton d'actualisation a été révoqué ou est devenu invalide d'une autre manière, la demande de nouveau jeton d'accès devrait-elle produire une erreur?
  2. Existe-t-il un moyen de valider le jeton d'actualisation?
36
Darth Flipman

Selon les documents de l'API Google sur les erreurs et les codes d'erreur:

https://developers.google.com/drive/handle-errors#401_invalid_credentials

401: Invalid Credentials

Invalid authorization header. The access token you're using is either expired or invalid.

error: {
  errors: [
   {
  "domain": "global",
  "reason": "authError",
  "message": "Invalid Credentials",
  "locationType": "header",
  "location": "Authorization",
  }
  ],
  "code": 401,
  "message": "Invalid Credentials"
  }
}

Cela correspond exactement à votre version de l'erreur, et c'est très probablement ce que Google pense être incorrect avec votre demande.

Mais, comme vous le savez bien, les demandes de l'API Google peuvent renvoyer des erreurs qui ne sont clairement pas utiles pour diagnostiquer réellement le problème. J'ai obtenu des erreurs "Informations d'identification non valides" pour un certain nombre de raisons. C'est presque toujours vraiment parce que j'ai apporté une sorte de changement que je pensais ne pas avoir d'importance, mais qui le fait vraiment.

Ma première pensée (prise dans l'obscurité ici) serait d'aller sur la console API Google:

https://code.google.com/apis/console

Le vérificateur de jetons d'authentification de Google ( https://www.googleapis.com/oauth2/v1/tokeninfo ) peut renvoyer une réponse valide, mais peut-être que le secret client ou l'ID client auront été modifiés.

Même de minuscules changements dans le corps de la réponse peuvent également provoquer cette erreur.

Je ne sais pas comment vous faites des requêtes, que ce soit par REST ou par une bibliothèque cliente, mais j'utilise la bibliothèque Ruby qui permet une interface en ligne de commande) pour effectuer des appels API. J'ai trouvé cela et le terrain de jeu OAuth2 très utiles pour diagnostiquer les appels API Google.

Juste un FYI: Je n'ai obtenu que 2 erreurs de l'API Google: "Informations d'identification non valides" et "Autorisations insuffisantes". Ce dernier a presque toujours eu à faire avec de mauvaises portées. Le premier est à peu près tout le reste.

Je dirais aussi que si vous n'avez connu que 2 erreurs en 6 mois, vous avez de la chance!

20
Paul Dacus

J'ai rencontré ce problème lorsque j'ai essayé de modifier l'URL de redirection dans la console Google, puis de mettre à jour mon fichier d'informations d'identification json sur le serveur. J'ai dû effacer les variables de session avant de recommencer. Donc, dans votre projet, faites-le une seule fois:

session_start(); //starts a session
session_unset(); //flushes out all the contents previously set

N'oubliez pas de supprimer la session_unset() après l'avoir exécutée à sec une fois.

7
Sriram Ranganathan

Je suis sur l'environnement de développement. J'ai eu ce problème également.

J'ai d'abord essayé d'actualiser les informations d'identification. Pas de résultat. Ensuite, j'ai supprimé mon application (puisque je suis toujours dans l'environnement de développement, ça allait, mais FAITES ATTENTION À CETTE ACTION si vous l'utilisez déjà en production), j'en ai créé une nouvelle, mis à jour les informations d'identification JSON sur le client .. encore, aucun résultat.

Je l'ai résolu en ouvrant sur une nouvelle instance de navigateur qui n'était pas connectée à mon compte Google (navigation privée, car je suis sur Firefox), à nouveau connectée à mon compte Google et j'ai essayé d'utiliser mon client (qui est une application Web ). J'ai été redirigé vers l'écran d'autorisation comme prévu et après cela, cela a bien fonctionné pour moi.

3
priki

J'ai récemment rencontré cette erreur étrange. Ma solution: j'ai mis la fonction qui désactive toutes les sessions avant de rediriger vers AuthUrl.

2
EatCodePlaySleep

Peut-être que ce comportement est dû à une limitation que Google décrit comme suit:

Il existe actuellement une limite de 50 jetons d'actualisation par compte d'utilisateur et par client. Si la limite est atteinte, la création d'un nouveau jeton invalide automatiquement le plus ancien jeton sans avertissement. Cette limite ne s'applique pas aux comptes de service.

Il existe également une limite plus importante sur le nombre total de jetons qu'un compte d'utilisateur ou un compte de service peut avoir sur tous les clients. La plupart des utilisateurs normaux ne dépasseront pas cette limite mais le compte de test d'un développeur pourrait .

2
ninsky

effacer le stockage dans Google Chrome a fonctionné pour moi (je ne sais pas tous les détails de ce que "Effacer le stockage" efface):

  1. F12 (Ctrl+Shift+I)
  2. Application Onglet
  3. Clear storage
2
Joe GI

J'ai eu le même problème avec cette erreur:

The redirect URI in the request, does not match the ones authorized for the OAuth client.

Mais j'ai trouvé cette solution très simple par abhishek77in ici:

https://coderwall.com/p/fmr5ag/avoid-invalid-credentials-with-google-oauth2

La solution est:

Si vous utilisez https://github.com/zquestz/omniauth-google-oauth2 assurez-vous de suivre la note dans le fichier README. " Vous devez activer" l'API Contacts "et" l'API Google+ "via la console API Google. "

L'activation de ceux-ci dans la console Google API a résolu le problème des "informations d'identification non valides" pour moi.

1
Matt Shirk

J'ai reçu (401) Invalid Credentials lorsque j'ai supprimé l'accès à mon compte Google pour l'application en question. J'ai donc dû demander l'URL d'autorisation (celle qui commence par https://accounts.google.com/o/oauth2/auth), encore.

0
iloo

J'ai résolu ce problème en supprimant les fichiers json dans les informations d'identification c:\Users\[utilisateur] \.

0
raphavini

userInfo: Invalid Credentials J'ai eu l'erreur suivante parce que les éléments du tableau des étendues auxquels j'essayais d'accéder, c'est-à-dire le profil et l'e-mail dont j'ai obtenu les liens depuis la page de portée Google + API: sont devenus en quelque sorte faux/invalides, donc je suis allé à mon écran de consentement et là sous - Étendues pour les API Google a été mentionné profil de messagerie openID en survolant chacun, je suis arrivé là URL respectives remplaçant mes anciennes avec celles-ci résolu mon erreur

0
Shubham Kakkar

J'ai rencontré ce même problème lorsque j'ai dû changer mes étendues de Lecture seule en Lecture et écriture de tous les fichiers. J'ai donc mis à jour mes étendues depuis le haut de mon fichier de Lecture seule vers:

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json
var SCOPES = ['https://www.googleapis.com/auth/drive'];

Google, à partir de leur guide API, a ces commentaires qui disent que chaque fois que vous modifiez les étendues, vous devez mettre à jour les informations d'identification. Je crois que cela signifie, bien que je ne sois pas certain, que le jeton doit être mis à jour. L'ancien jeton est toujours détenu par Google et il pensait que je n'avais qu'un accès en lecture seule, d'où la raison pour laquelle il retournerait une erreur 401. Donc, je dois refaire mon jeton, mais Google n'a jamais proposé un nouvel écran de consentement qui me permettrait de dire autoriser la lecture et l'écriture dans tous les fichiers. Donc, j'avais besoin que cet écran réapparaisse, donc il créerait un nouveau jeton pour remplacer l'ancien:

fs.readFile(TOKEN_PATH, function(err, token) {
    if (err) {
      getNewToken(oauth2Client, callback);
    } else {
        getNewToken(oauth2Client, callback);
    //   oauth2Client.credentials = JSON.parse(token);
    //   callback(oauth2Client);
    }
  });

Étant donné que j'avais déjà un jeton enregistré, il n'en créait jamais un nouveau. Donc, je viens de commenter l'utilisation de l'ancien jeton et lui ai dit d'obtenir un nouveau jeton, que nous en ayons un ou non. Ensuite, je suis allé à mes applications connectées dans Google et j'ai supprimé mon ancien identifiant de connexion. Je ne sais pas si cette étape est nécessaire, mais j'essaie seulement d'accéder à mon compte personnel. Ensuite, lorsque j'ai exécuté mon programme, cela m'a incité à me ré-authentifier, et tout a fonctionné et je n'ai pas reçu d'erreur d'authentification. Une fois terminé, assurez-vous de supprimer les lignes commentées pour utiliser des jetons déjà créés. J'utilisais le fichier quickstart.js de l'API Google pour tout cela.

Ainsi, lorsque j'ai mis à jour mes étendues, l'ancien jeton utilisait toujours l'étendue en lecture seule, donc j'obtiendrais (401) des informations d'identification non valides.

0
Daniel Jones