python 中的会话身份验证

Vov*_*ova 6 python session python-requests

在Python中使用requests模块中的会话,会话似乎只在第一个请求时发送授权,我不明白为什么会发生这种情况。

import requests
session = requests.Session()
session.auth = (u'user', 'test')
session.verify = False
response = session.get(url='https://my_url/rest/api/1.0/users')
Run Code Online (Sandbox Code Playgroud)

如果我查找此响应请求标头,我会看到:

{'Authorization': 'Basic auth_data', 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.12.3'}
Run Code Online (Sandbox Code Playgroud)

但如果我使用相同或不同的网址发送下一个请求:

response = session.get(url='https://my_url/rest/api/1.0/users')
Run Code Online (Sandbox Code Playgroud)

我可以看到请求中不再有 auth 标头:

print response.request.headers
{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.12.3'}
Run Code Online (Sandbox Code Playgroud)

因此我收到了 401 响应。

为什么会这样呢?会话不应该在使用它发出的每个请求中发送身份验证吗?如何使用会话发送每个请求的身份验证数据?

mha*_*wke 6

当我在您的评论中运行确切的代码时,我看到的是第一个Authorization中缺少标头,但第二个中却存在标头。这似乎与您报告的问题相反。 print

这是因为第一个请求由 301 响应重定向,并且 auth 标头不会在后续请求中传播到重定向位置。通过查看 ,您可以看到 auth 标头是在初始请求中发送的response.history[0].request.headers

第二个请求不会重定向,因为会话保持与主机的连接打开(由于标头Connection: keep-alive),因此当您print response.request.headers.

我怀疑您实际上正在使用https://test.com,但您正在使用的服务器可能会发生类似的情况。

对于测试,我建议使用非常方便的公共测试 HTTP 服务器https://httpbin.org/headers。这将在响应正文中返回服务器收到的标头。您可以使用重定向 URL 之一测试重定向请求。