【问题标题】:Cookie authentication with Python requests使用 Python 请求进行 Cookie 身份验证
【发布时间】:2014-10-02 14:38:19
【问题描述】:

我正在尝试使用 Python requests API 以编程方式模仿网站上的用户操作。 要以编程方式完成此操作,请求必须具有用户/通过身份验证,并且还应该通过少量 NVP 作为 Header 中的 Cookie。 为了获得 NVP,我最初提出了一个虚拟请求,服务器将 cookie 返回给我。 我从这些 cookie 中获取所需的值并使用它来发送实际请求。 但是请求没有成功,服务器抱怨我没有登录。 但是,如果我使用浏览器中的 cookie 值,请求就会成功。

以编程方式获取 cookie 中的 JSESSIONID、glide_user 和 glide_user_session 参数的虚拟请求是

response = requests.get('http://example.com/make_dummy_get',auth=('username','pasword'))
cookie_params = response.cookies.items()

下面是实际请求

headers =  {
'Host': 'example.com'
,'Connection': 'keep-alive'
,'Content-Length': 113
,'Cache-Control': 'max-age=0'
,'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
,'Origin': 'example.com'
,'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'
,'Content-Type': 'application/x-www-form-urlencoded'
,'Referer': 'www.example.com/asdas/'
,'Accept-Encoding': 'gzip,deflate,sdch'
,'Accept-Language': 'en-US,en;q=0.8'
,'Cookie': 'JSESSIONID=B6F7371A11825472CAB0366A4DCDD8EFB; glide_user="SC:Z3Vlc3Q=:b890b38b7f000001121dbe81a08c413ca5"; glide_user_session="SC:Z3Vlc3Q=:b890b38b7f000001121dbe81a08c413ca5"'
}

form_data = {
'param1': 'value1'
,'param2': 'value2'
,'param3': 'value3'
}

res = requests.post('http://example.com/make_post_request',auth=('username','pasword'),data=form_data,headers = headers)

在我看来,我的虚拟请求创建的会话由于某种原因正在关闭 因此第二个请求被拒绝,html响应说我必须登录才能访问请求的资源。

我对 Java apache 的 HttpClient 做了同样的练习并以同样的问题结束。我在这里缺少什么来使请求成功而没有任何登录或身份验证问题?

【问题讨论】:

    标签: python http authentication cookies python-requests


    【解决方案1】:

    首先,您应该使用请求中的 Session 对象。这将管理 cookie(并为您准备它们),因此您不必自己创建 cookie 标头。

    s = requests.Session()
    s.get('http://example.com/make_dummy_get',auth=('username','pasword'))
    print(s.cookies)
    

    接下来我要强烈建议您停止设置以下标头:

    • Host
    • Content-Length
    • Content-Type
    • Cookie

    所有这四个标头都将由requests 为您生成。 Cookie 标头将使用Session 使用的CookieJar 生成。 Content-LengthContent-Type 将在 requests 准备正文时计算。

    此外,如果您尝试使用 cookie 进行身份验证,服务器可能会变得混乱,因为您还在第二个请求中传递了 auth=('username', 'password')。这将生成一个授权标头,因此您将同时发送一个 Cookie 标头和一个 Authorization 标头。服务器认为这很可能是可疑的,并且正确地拒绝接受您的已验证请求。

    【讨论】:

    • 会话解决了 cokkie 问题,但由于某种原因,身份验证参数未按预期工作。我看到了登录页面在做什么,并复制了该请求而不是使用身份验证,并发出了成功的后续发布请求..
    • 注意:您无法在请求会话标头中看到 Host 标头。这是因为requests 没有添加标题。底层 http 模块在发送请求时会这样做:stackoverflow.com/q/57770557/2441026
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多