2017-02-25 13 views
0

J'essaie de demander des jetons d'accès à partir de l'API fitbit, mais il continue à retourner 401 Statut non autorisé, même si je configure la requête identique à une requête curl correspondante - qui réussit. Le message d'erreur retourné dit: "errorType":"invalid_client","message":"Invalid authorization header format. Y at-il une nuance de la façon dont httplib2 builds ses demandes qui me jetant ici ...Post demande échouant avec python httplib2, fonctionne avec curl

(travail) requête boucle:

curl -X POST -i 
-H 'Authorization: Basic <LONG_CODE>' 
-H 'Content-Type: application/x-www-form-urlencoded' 
-d "clientId=<CLIENT_ID>" 
-d "grant_type=authorization_code" 
-d "redirect_uri=http%3A%2F%2F127.0.0.1%3A5000%2Ffitbit-callback" 
-d "code=<AUTHORIZATION_GRANT_CODE>" 
https://api.fitbit.com/oauth2/token 

demande python non-travail (édité):

TOKEN_URL = 'https://api.fitbit.com'/oauth2/token' 
CALLBACK_URI = 'http://127.0.0.1:5000/fitbit-callback' 

auth_header = base64.b64encode(bytes(<CLIENT_ID> + ':' + <CLIENT_SECRET>, 'utf-8')) 
headers = { 
    'Authorization': 'Basic %s' % auth_header, 
    'Content-Type' : 'application/x-www-form-urlencoded' 
    } 

params = { 
    'client_id': <CLIENT_ID>, 
    'grant_type': 'authorization_code', 
    'redirect_uri': CALLBACK_URI, 
    'code': <AUTHORIZATION_GRANT_CODE> 
    } 
urlparams = urlencode(params) 

resp, content = h.request(TOKEN_URL, 
    'POST', 
    urlparams, 
    headers) 

ne ressort pas de code:

  • le auth_header -variable en python correspond <LONG_CODE>

réponse du terminal après python3 fitbit.py:

send: b"POST /oauth2/token HTTP/1.1\r\nHost: api.fitbit.com\r\nContent-Length: 153\r\nauthorization: Basic b'<LONG_CODE>'\r\ncontent-type: application/x-www-form-urlencoded\r\nuser-agent: Python-httplib2/0.10.3 (gzip)\r\naccept-encoding: gzip, deflate\r\n\r\n" 
send: b'client_id=<CLIENT_ID>&grant_type=authorization_code&redirect_uri=http%3A%2F%2F127.0.0.1%3A5000%2Ffitbit-callback&code=<AUTHORIZATION_GRANT_CODE>' 
reply: 'HTTP/1.1 401 Unauthorized\r\n' 
header: Date header: Content-Type header: Transfer-Encoding header: Connection header: Cache-control header: WWW-Authenticate header: Content-Language header: Content-Encoding header: Vary header: X-Frame-Options header: Server header: CF-RAY 

Courir print(content):

b'{"errors":[{"errorType":"invalid_client","message":"Invalid authorization header format. Visit https://dev.fitbit.com/docs/oauth2 for more information on the Fitbit Web API authorization process."}],"success":false}' 

Répondre

0

cela est bien maladroit. Je ne l'ai pas remarqué avant de diriger les requêtes vers un service de capture de requêtes qui me laisse les analyser (comme runscope), mais il me semble que j'ai manqué le formatage b'<LONG_CODE>' dans l'exemple python. Ce qu'il fixe:

auth_header.decode("utf-8")

Peut-être que cette question devrait être supprimée, si elle est peu susceptible d'aider quelqu'un d'autre ...