为什么Bearer无法在请求授权标头中工作?

时间:2017-01-13 09:40:24

标签: python authorization nest-api

我在通过python请求将带有Bearer的授权令牌发送到NEST API时遇到问题:

curl https://developer-api.nest.com -H "Authorization: Bearer c.123"
-H "Content-Type: application/json"

工作正常,但是:

nest_url = "https://developer-api.nest.com"
headers = {'Authorization': str('Bearer ' + token), 'Content-type': 'application/json'}
print(headers)
nest_data_req = requests.get(nest_url, headers=headers)

打印为:

  

{'内容类型':' application / json','授权':' Bearer c.123'}

失败了401未经授权,据我所知,他们正在尝试提出相同的请求,为什么curl工作(和postman相关)和python请求失败?

下图显示了邮递员的工作原理:

enter image description here 更新:

所以这段代码有效10次(其他9+给我401未经授权):

 url = "https://developer-api.nest.com/"
    auth_t = token.encode("ascii", "ignore")
    headers = {
        'authorization': "Bearer " + auth_t,
        'content-type': "application/json",
        'cache-control': "no-cache",
    }
    response = requests.request("GET", url, headers=headers)
    print(response.text)

如果我在邮递员中按提交,它每次都会有效。

1 个答案:

答案 0 :(得分:3)

转发这是嵌套API重定向的结果,因此您可以将此视为错误 - 因为标头已从重定向的请求中删除,标头应该在会话中。或者一个'功能'因为他们试图解决CVE。

所以这是处理这个问题的原型方法:

def get_nest_data(token):
    url = "https://developer-api.nest.com/"
    auth_t = token.encode("ascii", "ignore")
    headers = {
        'authorization': "Bearer " + auth_t,
        'content-type': "application/json",
    }

    try:
        init_res = requests.get('https://developer-api.nest.com', headers=headers, allow_redirects=False)
        if init_res.status_code == 307:
            api_response = requests.get(init_res.headers['Location'], headers=headers, allow_redirects=False)
            if  api_response.status_code == 200:
                return api_response.json()
        elif init_res.status_code == 200:
            return init_res.json()
    except Exception as ce:
        print(ce)