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

时间:2016-06-21 12:54:20

标签: python authentication redirect python-requests

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

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

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

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

谢谢你的时间!

CODE SNIPPET

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

更新

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

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

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

同样,我想知道是否只需拨打一次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)

2 个答案:

答案 0 :(得分:3)

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

Block

这可以解决您的问题。

答案 1 :(得分:0)

根据设计,这对于请求是不可能的。该问题源于一个安全漏洞,如果攻击者修改了重定向 URL 并且凭据会自动发送到重定向 URL,那么凭据就会遭到破坏。因此,凭据会从重定向调用中剥离。

github 上有一个关于这个的帖子: https://github.com/psf/requests/issues/2949