使用URLLIB2的客户端摘要式身份验证Python将不记得授权标头信息

时间:2009-11-10 09:29:13

标签: python authentication urllib2 digest

我正在尝试使用Python编写连接到使用摘要式身份验证的自定义http服务器的客户端。我可以毫无问题地连接并提取第一个请求。使用TCPDUMP(我在MAC OS X上 - 我既是MAC又是Python noob)我可以看到第一个请求实际上是两个http请求,正如您所熟悉的RFC2617。第一个结果是401 UNAUTHORIZED。从服务器发回的标头信息正确地用于为第二个请求生成标头,其中包含一些自定义授权标头值,这些标头值产生200 OK响应和有效负载。

一切都很棒。感谢urllib2,我的HTTPDigestAuthHandler开启工作正常。

在同一个程序中,我尝试从同一台服务器请求第二个不同的页面。根据RFC,我希望TCPDUMP这次只显示一个请求,使用几乎所有相同的授权头信息(nc应该递增)。

相反,它从头开始,首先得到401并重新生成200所需的信息。

urllib2是否可以使用摘要式身份验证的后续请求回收已知的授权标头值并仅执行一个请求?

[重读几次直到它有意义,我不知道如何让它变得更加简单]

谷歌的收益微乎其微,所以我猜不是。我查看了urllib2.py的代码及其非常混乱(评论如下:“这不是一个神话般的努力”),所以如果这是一个bug,我不会感到震惊。我注意到我的Connection Header已关闭,即使我将其设置为keepalive,它也会被覆盖。这导致我keepalive.py,但这对我也没有用。

Pycurl也不起作用。

我可以手动编写整个交互的代码,但我想尽可能地回顾现有的库。

总之,使用urllib2和digest身份验证可以从同一台服务器获取2个页面,只执行3个http请求(第一页为2,第二页为1)。

如果你以前碰巧试过这个并且已经知道它不可能,请告诉我。如果你有另一种选择,我会全力以赴。

提前致谢。

1 个答案:

答案 0 :(得分:1)

虽然它不是开箱即用的,urllib2足够灵活,可以自行添加。子类HTTPDigestAuthHandler,黑客攻击(我认为retry_http_digest_auth方法)记住身份验证信息并定义http_request(self, request)方法将其用于所有后续请求(添加WWW-Authenticate标头)。