基本身份验证不与请求库一起使用

ole*_*sii 24 python api python-requests appdynamics

我正在尝试在python中使用基本身份验证

auth = requests.post('http://' + hostname, auth=HTTPBasicAuth(user, password))
request = requests.get('http://' + hostname + '/rest/applications')
Run Code Online (Sandbox Code Playgroud)

响应表单auth变量:

<<class 'requests.cookies.RequestsCookieJar'>[<Cookie JSESSIONID=cb10906c6219c07f887dff5312fb for appdynamics/controller>]>
200
CaseInsensitiveDict({'content-encoding': 'gzip', 'x-powered-by': 'JSP/2.2', 'transfer-encoding': 'chunked', 'set-cookie': 'JSESSIONID=cb10906c6219c07f887dff5312fb; Path=/controller; HttpOnly', 'expires': 'Wed, 05 Nov 2014 19:03:37 GMT', 'server': 'nginx/1.1.19', 'connection': 'keep-alive', 'pragma': 'no-cache', 'cache-control': 'max-age=78000', 'date': 'Tue, 04 Nov 2014 21:23:37 GMT', 'content-type': 'text/html;charset=ISO-8859-1'})
Run Code Online (Sandbox Code Playgroud)

但是当我试图从不同的位置获取数据时, - 我有401错误

<<class 'requests.cookies.RequestsCookieJar'>[]>
401
CaseInsensitiveDict({'content-length': '1073', 'x-powered-by': 'Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2.2 Java/Oracle Corporation/1.7)', 'expires': 'Thu, 01 Jan 1970 00:00:00 UTC', 'server': 'nginx/1.1.19', 'connection': 'keep-alive', 'pragma': 'No-cache', 'cache-control': 'no-cache', 'date': 'Tue, 04 Nov 2014 21:23:37 GMT', 'content-type': 'text/html', 'www-authenticate': 'Basic realm="controller_realm"'})
Run Code Online (Sandbox Code Playgroud)

据我所知 - 在第二个请求中不是替换会话参数.

Mar*_*ers 39

您需要使用会话对象并发送每个请求的身份验证.会议还将为您跟踪Cookie:

session = requests.Session()
session.auth = (user, password)

auth = session.post('http://' + hostname)
response = session.get('http://' + hostname + '/rest/applications')
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回复,但它也不起作用:(错误与以前相同 (2认同)
  • @MartijnPieters 读了你的评论第十遍后。我还是不明白。我可以在邮递员中使用 basicAuth 。Postman 会将用户名/密码消化到标头“Authorization: Basic &lt;....&gt;”中。但我无法连接为什么我需要这里的会话,但它有效!@oleksii 的尝试有什么问题吗? (2认同)
  • @Sarit:标题需要包含在您发送到服务器的*每个请求*中;通常服务器可以根据存在的标头对您进行身份验证的唯一方法,没有其他信息。将标头添加到每个请求的*最简单* 方法是使用会话。您不必*必须*,但是您必须在每个请求中手动包含标头。 (2认同)

小智 24

import requests

from requests.auth import HTTPBasicAuth
res = requests.post('https://api.github.com/user', verify=False, auth=HTTPBasicAuth('user', 'password'))
print (res)
Run Code Online (Sandbox Code Playgroud)

注意:有时,我们可能会得到 SSL 错误证书验证失败,为了避免,我们可以使用 verify=False

  • ```requests.posts``` 对我不起作用,但 ```requests.get``` 可以,还有一个较短的版本 ```requests.get(url, auth=(username, password))` `` (6认同)
  • 这并没有回答有关使用会话 cookie 来验证后续请求的问题。 (4认同)

Wyr*_*ood 23

示例与您的代码略有不同.

>>> from requests.auth import HTTPBasicAuth
>>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
<Response [200]>
Run Code Online (Sandbox Code Playgroud)

  • 同样的文档还说使用`HTTPBasicAuth`对象是*optional*; 传递用户名和密码元组做*完全相同的事情*因为它是常见的基本情况. (5认同)

ali*_*ran 8

在 Python3 中它变得容易:

import requests
response = requests.get(uri, auth=(user, password))
Run Code Online (Sandbox Code Playgroud)

  • 这并没有回答有关使用会话 cookie 来验证后续请求的问题。 (4认同)