Python请求的Cookie身份验证

Python请求的Cookie身份验证,python,http,authentication,cookies,python-requests,Python,Http,Authentication,Cookies,Python Requests,我试图使用PythonrequestsAPI以编程方式模拟站点上的用户操作。 要以编程方式完成此任务,请求必须具有用户/通过身份验证,并且还应在标头中作为cookie传递少量NVP。 为了获得NVP,我首先发出一个虚拟请求,服务器返回cookies给我。 我从这些cookie中获取所需的值,并使用这些值发送实际请求。 但是请求没有成功,服务器抱怨我没有登录。 但是如果我使用浏览器中的cookie值,请求就会成功 在cookie中以编程方式获取JSSessionID、glide_user和glid

我试图使用Python
requests
API以编程方式模拟站点上的用户操作。 要以编程方式完成此任务,请求必须具有用户/通过身份验证,并且还应在标头中作为cookie传递少量NVP。 为了获得NVP,我首先发出一个虚拟请求,服务器返回cookies给我。 我从这些cookie中获取所需的值,并使用这些值发送实际请求。 但是请求没有成功,服务器抱怨我没有登录。 但是如果我使用浏览器中的cookie值,请求就会成功

在cookie中以编程方式获取JSSessionID、glide_user和glide_user_会话参数的伪请求是

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上做了同样的练习,并以同样的问题结束。我在这里缺少什么使请求在没有任何登录或身份验证问题的情况下成功?

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

s = requests.Session()
s.get('http://example.com/make_dummy_get',auth=('username','pasword'))
print(s.cookies)
接下来,我必须强烈建议您停止设置以下标题:

  • 主机
  • 内容长度
  • 内容类型
  • Cookie
所有四个标题都将由
请求为您生成。
Cookie
头将使用
Session
使用的
CookieJar
生成。当
请求
准备正文时,将计算
内容长度
内容类型


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

会话解决了cokkie问题,但由于某些原因,auth参数未按预期工作。我看到登录页面正在做什么,并复制了该请求,而不是使用auth,并发出了随后的post请求,该请求成功..注意:在请求会话头中无法看到
Host
头。这是因为
请求
没有添加标题。发送请求时,底层http模块将执行以下操作: