TLDR
URL-адрес, который вы запрашиваете, перенаправляет запросы POST на другой хост, поэтому библиотека запросов отбрасывает заголовок Authoriztion
, опасаясь утечки учетных данных. Чтобы исправить это, вы можете переопределить ответственный метод в классе запросов * Session
.
Подробности
В запросах 2.4.3 единственное место, где reqeuests
удаляет заголовок Authorization
- это когда запрос перенаправляется на другой хост. Это соответствующий код :
if 'Authorization' in headers:
# If we get redirected to a new host, we should strip out any
# authentication headers.
original_parsed = urlparse(response.request.url)
redirect_parsed = urlparse(url)
if (original_parsed.hostname != redirect_parsed.hostname):
del headers['Authorization']
В более новых версиях requests
заголовок Authorization
будет пропущен в других случаях (например, если перенаправление происходит с безопасного на незащищенный протокол).
Так что, вероятно, в вашем случае происходит то, что ваши POST-запросы перенаправляются на другой хост. Единственный способ обеспечить аутентификацию для перенаправленного хоста, используя библиотеку запросов, - это файл .netrc
. К сожалению, это позволит вам использовать только HTTP Basi c Auth, который вам мало поможет. В этом случае лучшее решение, вероятно, состоит в том, чтобы создать подкласс requests.Session
и переопределить это поведение, например:
from requests import Session
class NoRebuildAuthSession(Session):
def rebuild_auth(self, prepared_request, response):
"""
No code here means requests will always preserve the Authorization
header when redirected.
Be careful not to leak your credentials to untrusted hosts!
"""
session = NoRebuildAuthSession()
response = session.post('https://myserver.com/endpoint', headers=headers, data=data)