2017-02-25 87 views
0

我試圖從fitbit API請求訪問令牌,但它始終返回401未授權狀態,即使我將請求配置爲與相應的curl查詢相同 - 即成功。返回的錯誤消息稱:"errorType":"invalid_client","message":"Invalid authorization header format.是否存在的httplib2的如何建立其請求被扔我在這裏下車了一些細微差別......使用python httplib2發送請求失敗,使用curl

(工作)捲曲查詢:

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 

非工作蟒蛇請求(編):

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) 

不從代碼明顯:

  • auth_header -variable在python匹配python3 fitbit.py<LONG_CODE>

終端響應:

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 

運行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}' 

回答

0

嗯,這是尷尬。在我將請求指向請求捕獲服務之前,我沒有注意到它,可以讓我分析它們(比如runscope),但我似乎只是錯過了python示例中的b'<LONG_CODE>'格式。這個固定:

auth_header.decode("utf-8")

也許這個問題應該被刪除,如果是不太可能幫助別人......