0

MISE À JOUR: Résolu. Je faisais en effet une erreur fondamentale, entre autres choses. Mon utilisation de la fonction session.headers.update était incorrecte; au lieu de session.headers.update = {foo:bar}, je devais faire session.headers.update({foo:bar}). De plus, je l'ai changé la section suivante du code:Demande de jeton d'accès au compte de service Google: "Le paramètre requis est manquant: grant_type"

De ceci:

payload = urllib.parse.urlencode({ 
    "grant_type":"urn:ietf:params:oauth:grant-type:jwt-bearer", 
    "assertion": str(token) 
}) 

à ceci:

payload = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" + token.decode("utf-8") 

Le code fonctionne maintenant comme prévu.


question originale ci-dessous

J'ai vu plusieurs hits de SO et Google sur ce problème; aucun d'entre eux n'a aidé, bien que je me sois assurément assuré de vérifier mon code pour m'assurer que je ne suis pas coupable des mêmes problèmes que ceux-ci. Les problèmes que les gens ont tendance à avoir consistent à transmettre les données du POST en tant que paramètres ou POSTing à la mauvaise URL, ce que je ne fais pas, pour autant que je sache. De plus, la plupart des hits que j'ai trouvés impliquent OAuth2 à 3 pattes impliquant des utilisateurs; J'ai trouvé relativement peu de résultats concernant les comptes de service et les JWT, qui diffèrent suffisamment du flux d'utilisateurs pour lesquels je suis préoccupé par leur pertinence par rapport à mon problème. J'essaie d'obtenir un jeton d'accès du serveur d'authentification Google pour un compte de service. J'ai généré mon JWT et je veux maintenant POSTER au serveur pour recevoir mon jeton d'accès. J'ai défini les en-têtes conformément à la documentation décrite sous here, sous la rubrique "Création de la demande de jeton d'accès" et, pour autant que je sache, ma requête est conforme aux spécifications, mais Google répond par une réponse 400 et le code JSON suivant :

{'error': 'invalid_request', 'error_description': 'Required parameter is missing: grant_type'} 

Voici le code origine du problème:

# Returns the session, now with the Host and Authorization headers set. 
def gAuthenticate(session): 
    token = createJWT() 
    session.headers.update = { 
     "Host": "www.googleapis.com", 
     "Content-Type": "application/x-www-form-urlencoded" 
    } 
    payload = urllib.parse.urlencode({ 
     "grant_type":"urn:ietf:params:oauth:grant-type:jwt-bearer", 
     "assertion": str(token) 
    }) 
    response = session.post("https://www.googleapis.com/oauth2/v4/token", data = payload) 

    session.headers.update = {"Authorization": "Bearer " + response.json()["access_token"]} 
    return session 

Je vais avoir beaucoup de problèmes étranges avec ce code. Tout d'abord, si je n'ai pas urllib.parse.urlencode mon dictionnaire (c'est-à-dire simplement payload = {dictionary}), je reçois seulement une erreur Bad Request/'invalid_request', ce que je suppose du message d'erreur moins spécifique signifie que c'est moins acceptable que ce que je suis en train de faire. Pourquoi dois-je faire cela? Les demandes ne sont-elles pas censées encoder mes données pour moi? Je n'ai jamais eu ce problème lors de POSTing avec des demandes avant. Deuxièmement, l'examen de la requête préparée avant son envoi révèle que mes en-têtes ne sont pas correctement définis, malgré la mise à jour de l'en-tête. Aucun des en-têtes que j'ai ajoutés à la demande n'est transmis.

J'ai examiné le corps de la requête et il semble être identique (sauf bien sûr le contenu du JWT) à celui que Google fournit comme exemple dans la documentation. Tout cela me porte à croire que je fais une erreur très basique quelque part, mais je n'ai pas réussi à la trouver. Qu'est-ce que je fais mal ici? Des liens vers toute documentation utile seraient extrêmement appréciés; Merci pour votre temps et votre attention.

Répondre

0

Essayez "grant_type": "code_autorisation". Et ajoutez le type de subvention en tant qu'en-tête.

Aussi, vérifiez ce lien - Accessing Google oAuth giving invalid grant_type (Bad request)

+0

J'ai essayé, mais sans succès; Je reçois toujours le même message d'erreur. – ModelHX

+0

Avez-vous ajouté le grant_type en tant que partie de l'en-tête et non en tant que charge utile? – Sayali

+0

Publier avec 'grant_type' dans la charge utile et dans l'en-tête (et changé en' authorisation_code' donne le même message d'erreur que ci-dessus, l'enregistrement avec 'grant_type' dans seulement l'en-tête donne le message d'erreur' {'error_uri': '', 'error_description': 'Le paramètre requis est manquant: grant_type', 'error': 'invalid_request'} ' – ModelHX