【问题标题】:Basic Authentication returns 401 Client Error but works in postman基本身份验证返回 401 客户端错误,但在邮递员中有效
【发布时间】:2018-07-29 15:09:32
【问题描述】:

我已经浏览了许多与使用基本身份验证触发 GET 请求相关的类似帖子(例如:Python, HTTPS GET with basic authentication),但仍然无法找出问题所在。我不断收到错误 requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url

使用相同的凭据,标题在邮递员中尝试相同,它按预期工作。验证了api_key的base64encoded值,password和postman中使用的值完全一样,所以我认为不是它的编码或资源访问权限问题。

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()

你能提供一些指导吗?

【问题讨论】:

  • 有什么理由不使用requests.get(url, headers=headers, auth=(api_key, password)) 而不是手动设置授权标头?
  • @JonClements 也尝试了该选项,仍然是相同的 401 客户端错误,更新后的代码
  • 如果一切都与邮递员完全相同 - 可能值得检查服务器是否因为用户代理或其他原因而拒绝请求?
  • 我认为出现此错误是因为您缺少 User-Agent 标头
  • 你解决了这个问题吗?解决方案是什么?

标签: python python-requests basic-authentication


【解决方案1】:

我遇到了类似的问题(尽管在 .NET Framework 中)。

在我的情况下,原因是我最后使用了没有正斜杠的 url,而 API 显然不支持。

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

未经授权引发 401 错误

但是

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

返回 200 OK。

【讨论】:

    【解决方案2】:

    较早的帖子,但我遇到了类似的问题。 Postman 将缓存您的 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2021-12-04
      • 2012-01-03
      • 1970-01-01
      相关资源
      最近更新 更多