使用httplib2处理认证和代理服务器

2 投票
1 回答
1688 浏览
提问于 2025-04-15 12:40

我正在尝试测试与一个需要身份验证的Nexus服务器的交互,因为我打算使用一些操作,但我还需要处理一个内部的代理服务器。

根据我(有限的)理解,我可以给打开器添加多个处理程序。不过,我仍然收到了401的响应。我检查过用户名和密码是有效的。我不确定是否需要使用cookies,如果需要的话,应该怎么包含这些cookies。有什么建议吗?

baseUrl = 'server:8070/nexus-webapp-1.3.3/service/local'

params = {"[key]":"[value]"}

data = urllib.urlencode(params)

# create a password manager
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

# Add the username and password as supplied
password_mgr.add_password(None, baseUrl, username, password)

handler = urllib2.HTTPBasicAuthHandler(password_mgr)
proxy_support = urllib2.ProxyHandler({})

# create "opener" (OpenerDirector instance)
opener = urllib2.build_opener(proxy_support, handler)
urllib2.install_opener(opener)

txheaders =  {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}

req = Request(protocol+url, data, txheaders)
handle = urlopen(req)

这是URLError的头部字段:

>HTTPMessage: Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=B4BD05C9582F7B27495CBB675A339724; Path=/nexus-webapp-1.3.3
WWW-Authenticate: NxBASIC realm="Sonatype Nexus Repository Manager API"
Content-Type: text/html;charset=utf-8
Content-Length: 954
Date: Fri, 03 Jul 2009 17:38:42 GMT
Connection: close

更新
看起来Nexus实现了一个自定义版本的Restlet的AuthenticationHelper。多亏了Alex,我知道该找什么了。

1 个回答

3

你能把你收到的401响应的完整头信息发给我吗?也许这不是一个基本的身份验证请求,可能是代理服务器需要自己进行身份验证——不看到这些头信息,我很难猜测!

编辑:谢谢你展示了头信息(我把它们格式化成“代码”,否则看起来太乱了)。

正如我猜测的那样,它不想要“Basic”,而是需要其他的(Nexus专有的...?)“NxBASIC”身份验证协议——我从来没听说过这个(我对Nexus一无所知),我想你用的基本身份验证处理程序也不知道这个协议(即使NxBASIC somehow接受普通的基本身份验证,处理程序只知道这是一个不同的协议,也不会提供这样的身份验证)。

所以,首先你需要研究一下这个NxBASIC到底是什么,为此我觉得在StackOverflow上问个合适的问题可能会有帮助。然后,根据你学到的东西,就会出现一个有趣的问题,就是如何为它定义一个处理程序...!-(

撰写回答