我正在尝试从 Jekins 服务器获取 URL。直到最近,我才能够使用此页面上描述的模式(HOWTO 使用 urllib2 获取 Internet 资源)创建一个密码管理器,该管理器使用用户名和密码正确响应 BasicAuth 挑战。一切都很好,直到 Jenkins 团队更改了他们的安全模型,并且该代码不再有效。
# DOES NOT WORK!
import urllib2
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
top_level_url = "http://localhost:8080"
password_mgr.add_password(None, top_level_url, 'sal', 'foobar')
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)
a_url = 'http://localhost:8080/job/foo/4/api/python'
print opener.open(a_url).read()
堆栈跟踪:
Traceback (most recent call last):
File "/home/sal/workspace/jenkinsapi/src/examples/password.py", line 11, in <module>
print opener.open(a_url).read()
File "/usr/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
[Finished in 0.0s with exit code 1]
问题似乎是 Jenkins 返回的不是预期的 401 代码,而是 urllib2 将其解释为对话结束的 403。它实际上从未发送过密码。在 github 上浏览了一番后,发现另一个开发人员的解决方案可以工作......
# WORKS... SORTA
def auth_headers(username, password):
return 'Basic ' + base64.encodestring('%s:%s' % (username, password))[:-1]
auth = auth_headers('sal', 'foobar')
top_level_url = "http://localhost:8080"
a_url = 'http://localhost:8080/job/foo/4/api/python'
req = urllib2.Request(a_url)
req.add_header('Authorization', auth)
print urllib2.urlopen(req).read()
但这似乎不太令人满意。不必费心检查域是否与用户名和密码相关......它只是发送我的登录详细信息!
任何人都可以建议一种使原始脚本工作的方法吗?我想以可以登录 Jenkins 的方式使用 urllib2 密码管理器。