基本身份验证返回401客户端错误,但在邮递员中有效

时间:2018-07-29 15:09:33

标签: python python-requests http-basic-authentication

我遍历了许多与使用Basic Auth触发GET请求有关的类似帖子(例如:Python, HTTPS GET with basic authentication),但仍然无法解决问题。我不断收到错误 requests.exceptions.HTTPError:401客户端错误:未经授权的网址

使用相同的凭据,邮件头在邮递员中的尝试与预期相同。验证了api_key,password的base64encoded值与邮递员中使用的值完全相同,因此我认为它的编码或资源访问权限没有问题。

python -V
Python 3.6.4 :: Anaconda, Inc.

方法1

api_key = 'some_api_key'
password = 'some_password'
headers = {'accept': 'application/json'}

url = 'https://test.access.com/this/url'

api_key_password = "%s:%s" % (api_key, password)

b64_encoded = b64encode(bytes(api_key_password, 'utf-8')).decode("ascii")

headers['authorization'] = 'Basic %s' %  b64_encoded

response = requests.get(url,
                        headers=headers)

if (response.ok):
    json_data = json.loads(response.content)
    print (json_data)
else:
    print (response)
    response.raise_for_status()

方法2

api_key = 'some_api_key'
password = 'some_password'

url = 'https://test.access.com/this/url'

headers = {
    'accept': 'application/json',
}

response = requests.get(url, headers=headers, auth=(api_key, password))
print (response.ok)

if (response.ok):
    json_data = json.loads(response.content)
    print (json_data)
else:
    print (response)
    response.raise_for_status()

能否请您提供一些提示?

2 个答案:

答案 0 :(得分:0)

我有一个类似的问题(尽管在.NET Framework中)。

在我的情况下,原因是我使用的URL末尾没有正斜杠,并且该API显然不支持该URL。

所以https://test.access.com/this/url

未经授权引发401错误

但是

https://test.access.com/this/url/

返回200 OK。

答案 1 :(得分:0)

较早的帖子,但我遇到了类似的问题。邮递员将缓存您的JSESSIONID。确保在测试时清除了该cookie。如果击中需要登录API调用才能建立会话的API,然后再进行后续API调用,则此Postman行为会产生错误的安全感。

在这种情况下,对于Python请求,可以使用类似于我在下面提供的代码来处理它:

import requests,json

loginAPI = "https://myapi.myco.comv/someuri/someuri/users/login"
someHTTPGetAPI = "https://myapi.myco.com/someuri/someuri/someservice"
username = "myuser"
password = "mypass"

headers = {
    "Content-Type": "application/json",
    "login": username,
    "password": password
}

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
verify=False

session = requests.Session()
sessionResponse = session.get(url=loginURL,headers=headers, verify=verify)

if sessionResponse.status_code == 200:
    getResponse = session.get(url=someHTTPGetAPI)

    if getResponse.status_code == 200:
        responseJSON = agentStatus.json()