Python 请求 - 重定向后的身份验证

Ada*_*ron 5 python authentication redirect python-requests

我有一个关于重定向后 HTTP 基本身份验证的快速问题。

我正在尝试登录一个网站,出于操作原因,该网站使用 HTTP 302 响应立即将我重定向到中央登录站点。在我的测试中,请求模块在重定向后似乎没有将我的凭据发送到中央登录站点。如下面的代码片段所示,我被迫从响应对象中提取重定向 URL 并再次尝试登录。

我的问题很简单:
有没有办法强制请求在重定向脱离主机后重新发送登录凭据?

出于可移植性的原因,我不想使用 .netrc 文件。此外,该网站的提供商已将 url_login 设为静态,但并未对 url_redirect 做出此类声明。

谢谢你的时间!

代码片段

import requests

url_login = '<url_login>'
myauth = ('<username>', '<password')

login1 = requests.request('get', url_login, auth=myauth)
# this login fails; response object contains the login form information

url_redirect = login1.url
login2 = requests.request('get', url_redirect, auth=myauth)
# this login succeeds; response object contains a welcome message
Run Code Online (Sandbox Code Playgroud)

更新

这是上述通用代码的更具体版本。

  • 第一个request()返回 HTTP 200 响应并在其文本字段中包含表单信息。
  • 第二个在其文本字段中request()返回 HTTP 401 响应'HTTP Basic: Access denied.'

(当然,当提供有效凭据时登录成功。)

再次,我想知道我是否可以通过一次调用来实现我想要的登录requests.request()

import requests

url_login = 'http://cddis-basin.gsfc.nasa.gov/CDDIS_FileUpload/login' 
myauth = ('<username>', '<password>') 

with requests.session() as s: 
    login1 = s.request('get', url_login, auth=myauth) 
    url_earthdata = login1.url 
    login2 = s.request('get', url_earthdata, auth=myauth)
Run Code Online (Sandbox Code Playgroud)

sup*_*del 5

我对此的解决方案是使用“会话”。以下是您可以如何实现 Session。

import requests

s = requests.session()
url_login = "<loginUrl>"

payload = {
    "username": "<user>",
    "password": "<pass>"
}

req1 = s.post(url_login, data=payload)

# Now to make sure you do not get the "Access denied", use the same session variable for the request.

req2 = s.get(url_earthdata)
Run Code Online (Sandbox Code Playgroud)

这应该可以解决您的问题。

  • HTTP 302 的重点是执行**URL 重定向**。带有 302 状态码的响应在 **location** 键下的 **header** 上提供了一个重定向 URL,该 URL 将通过发出 **另一个请求** 来触发。因此,**不**,您无法通过**单个请求** 实现您的目标。 (4认同)
  • 在这种情况下,您可以在第一个请求中使用“allow_redirects=False”来获取重定向 URL。只需浏览您寻找的“url_earthdata”的第一个请求的标头。例如,&gt;&gt;&gt; req1 = s.post(url_login, data=payload, allow_redirects=False) &gt;&gt;&gt; url_earthdata = req1.headers["&lt;URL_KEY&gt;"] (3认同)

小智 5

根据设计,这对于 Requests 来说是不可能的。该问题源于一个安全漏洞,如果攻击者修改重定向 URL并且凭据自动发送到重定向 URL,那么凭据就会受到损害。因此,凭据将从重定向调用中删除。

github 上有一个关于此问题的线程: https ://github.com/psf/requests/issues/2949