Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/07/2021, à 13:43

weezixx

[Résolu] Python Curl

Bonjour,

je réalise un projet qui utilise une API, mais je suis bloqué à un endroit c'est la création automatique du token.

Voici ce que la FAQ du site m'indique :

    1.Se rendre sur la page « Subscription » et récupérer les informations « Consumer Key » et « Consumer Secret ».
    2.Construire sa requête CURL comme suit : curl -k -d "grant_type=client_credentials" -H "Authorization: Basic BASE64KEY+:+SECRET" https://opendata-api.stib-mivb.be/token
    3.Ecrire ses consumer key et secret key comme suit :« votreconsumerKey:votreconsumerSecret ». Et le convertir en Base64.
    4.Dans la commande, remplacer BASE64KEY+:+SECRET par les deux clés converties.

Et voici ce que moi j'ai codé :

message = "XXXXXXXX:YYYYYYYYYY" <-- c'est mon votreconsumerKey:votreconsumerSecret récupéré sur le site même qui me fournit l'API (le point 3.)
message_bytes = message.encode('ascii')
base64_bytes = base64.b64encode(message_bytes)
base64_message = base64_bytes.decode('ascii')

 headers = {'Accept': 'application/json', 'Authorization': 'Bearer %s' %message}

Évidemment ça ne fonctionne pas et ça me renvoie un joli :

<ams:fault xmlns:ams="http://wso2.org/apimanager/security"><ams:code>900901</ams:code><ams:message>Invalid Credentials</ams:message><ams:description>Access failure for API: /OperationMonitoring/4.0, version: 4.0. Make sure your have given the correct access token</ams:description></ams:fault>

Alors que si je me rend sur le site et que je génère moi même un token, et que je remplace par message, tout fonctionne niquel.

Où est mon erreur ?

Merci

Dernière modification par weezixx (Le 07/07/2021, à 16:47)

Hors ligne

#2 Le 07/07/2021, à 14:01

soshy

Re : [Résolu] Python Curl

Salut,

primo, tu viens de donner tes accès... Tu devrais éditer ton message pour masquer au moins partiellement la première ligne de ton extrait de code.

Ensuite, tu dois...
1- Faire une première requête équivalent au curl mentionné afin de récupérer un bearer token dans la réponse.
2- Utiliser le bearer issu de la réponse de l'étape précédente pour les autres requêtes vers ton api

Ta première requête doit être un POST avec
- en body : "grant_type=client_credentials"
- en header: "Authorization: Basic " + base64(message)

Et normalement avec ça, tu devrais récupérer un access_token, que tu mettras directement dans le header authorization.
Exemple :

Authorization: Bearer mon_access_token 

Dernière modification par soshy (Le 07/07/2021, à 14:05)

Hors ligne

#3 Le 07/07/2021, à 14:10

weezixx

Re : [Résolu] Python Curl

Merci de ta réponse,

je pense que c'est justement la requête curl que j'ai du mal à faire en python.

J'arrive pas à bien convertir le " curl -k -d "grant_type=client_credentials" -H "Authorization: Basic BASE64KEY+:+SECRET" https://opendata-api.stib-mivb.be/token"
en python.

Hors ligne

#4 Le 07/07/2021, à 15:56

soshy

Re : [Résolu] Python Curl

#!/usr/bin/env python3

import requests
import base64

accessKeys='XXXXXXXX:YYYYYYYYYY'

# conversion de accessKeys en base64
base64AccessKeys=base64.b64encode(accessKeys.encode('ascii')).decode('ascii')

# headers pour la requete HTTP
headers={ 'Authorization': 'Basic ' + base64AccessKeys }

# demande du bearer token
reponse = requests.post('https://opendata-api.stib-mivb.be/token', headers=headers, data='grant_type=client_credentials')

# affichage de la réponse à la demande, elle contient le bearer token à utiliser pour la suite
print(reponse.text)
bearerToken=reponse.json()['access_token']

# nouveau headers à utiliser pour les autres requêtes
headers={ 'Authorization': 'Bearer ' + bearerToken }

# la suite...

Dernière modification par soshy (Le 07/07/2021, à 15:58)

Hors ligne

#5 Le 07/07/2021, à 16:46

weezixx

Re : [Résolu] Python Curl

ça fonctionne niquel !

Jamais j'aurai trouvé ça tout seul ^^mais je vais étudier ta réponse wink

Merci encore!

Hors ligne