为什么 Bearer 在请求授权中不起作用 header?
Why does Bearer not work in requests authorization header?
我在通过 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)
打印为:
{'Content-type': 'application/json', 'Authorization': 'Bearer c.123'}
因 401 未经授权而失败,据我所知,他们正在尝试发出相同的请求,那么为什么 curl 工作(以及邮递员就此而言)并且 python 请求失败?
下图显示了邮递员中的相同工作:
更新:
所以此代码在 10 次中有效 1 次(其他 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)
如果我在邮递员中按提交,它每次都能正常工作。
原来这是 nest 的 API 重定向的结果,因此您可以认为这是一个错误 - 因为 headers 已从重定向请求中删除,而 headers 应该在session。或者 'feature' 因为他们试图解决 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)
我在通过 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)
打印为:
{'Content-type': 'application/json', 'Authorization': 'Bearer c.123'}
因 401 未经授权而失败,据我所知,他们正在尝试发出相同的请求,那么为什么 curl 工作(以及邮递员就此而言)并且 python 请求失败?
下图显示了邮递员中的相同工作:
所以此代码在 10 次中有效 1 次(其他 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)
如果我在邮递员中按提交,它每次都能正常工作。
原来这是 nest 的 API 重定向的结果,因此您可以认为这是一个错误 - 因为 headers 已从重定向请求中删除,而 headers 应该在session。或者 'feature' 因为他们试图解决 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)