Python使用URLLIB2进行客户端摘要认证无法记住授权头信息

1 投票
1 回答
1973 浏览
提问于 2025-04-15 15:51

我正在尝试用Python写一个客户端,连接到一个使用摘要认证的自定义HTTP服务器。我可以顺利连接并获取第一个请求。通过使用TCPDUMP(我在MAC OS X上——我对MAC和Python都不太熟悉),我发现第一个请求实际上是两个HTTP请求。如果你了解RFC2617,你会知道这是正常的。第一个请求返回401未授权的状态。服务器返回的头信息被正确地用来生成第二个请求的头部,里面包含一些自定义的授权信息,最终得到了200成功的响应和数据。

一切都很好。我的HTTPDigestAuthHandler打开器工作得不错,多亏了urllib2。

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

然而,它却从头开始,首先得到401,然后重新生成所需的信息以获得200。

使用urllib2,是否可以让后续的请求在摘要认证中重复使用已知的授权头信息,只发出一个请求?

[多读几遍,直到你明白为止,我也不知道怎么说得更简单]

谷歌搜索的结果出乎意料地少,所以我猜可能不行。我查看了urllib2.py的代码,发现它真的很乱(里面有评论说:“这不是个很棒的努力”),所以如果这是个bug我也不会感到惊讶。我注意到我的连接头是关闭的,即使我设置为保持连接,它也会被覆盖。这让我去看keepalive.py,但那也没能解决我的问题。

Pycurl也不行。

我可以手动编写整个交互过程,但我希望尽可能利用现有的库。

总之,使用urllib2和摘要认证,是否可以从同一个服务器获取两个页面,只执行3个HTTP请求(第一个页面2个,请求,第二个页面1个)?

如果你之前尝试过这个并且知道不可能,请告诉我。如果你有其他的解决方案,我非常乐意听取。

提前谢谢你。

1 个回答

1

虽然这个功能一开始没有直接提供,但urllib2足够灵活,你可以自己添加。你需要创建一个HTTPDigestAuthHandler的子类,然后修改它(我觉得是retry_http_digest_auth这个方法),让它记住认证信息。接着,定义一个http_request(self, request)的方法,用来在后续的请求中使用这些信息(添加WWW-Authenticate头部)。

撰写回答