5

我需要对 HTTP 服务器执行抢先式基本身份验证,即立即进行身份验证,而无需等待 401 响应。这可以用httplib2完成吗?

编辑:

我通过在请求中添加一个 Authorization 标头来解决它,正如接受的答案中所建议的那样:

 headers["Authorization"] = "Basic {0}".format(
        base64.b64encode("{0}:{1}".format(username, password)))
4

3 回答 3

4

在您的初始请求中添加适当格式的“授权”标头。

于 2011-08-16T11:33:05.410 回答
4

这也适用于内置httplib(对于希望最小化 3rd-party 库/模块的任何人)。我正在使用 Jenkins 可以为每个用户创建的 API 令牌对我们的 Jenkins 服务器进行身份验证。

>>> import base64, httplib
>>> headers = {}
>>> headers["Authorization"] = "Basic {0}".format(
        base64.b64encode("{0}:{1}".format('<username>', '<jenkins_API_token>')))

>>> ## Enable the job
>>> conn = httplib.HTTPConnection('jenkins.myserver.net')
>>> conn.request('POST', '/job/Foo-trunk/enable', None, headers)
>>> resp = conn.getresponse()
>>> resp.status
302

>>> ## Disable the job
>>> conn = httplib.HTTPConnection('jenkins.myserver.net')
>>> conn.request('POST', '/job/Foo-trunk/disable', None, headers)
>>> resp = conn.getresponse()
>>> resp.status
302
于 2011-11-22T18:40:43.273 回答
1

我意识到这已经过时了,但是我想如果您将 Python 3 与 httplib2 一起使用,我会提出解决方案,因为我无法在其他任何地方找到它。我还使用每个 Jenkins 用户的 API 令牌对 Jenkins 服务器进行身份验证。如果您不关心 Jenkins,只需用实际用户的密码替换 API 令牌。

b64encode 需要一个 ASCII 字符的二进制字符串。在 Python 3 中,如果传入纯字符串,则会引发 TypeError。为了解决此问题,标头的“user:api_token”部分必须使用“ascii”或“utf-8”进行编码,并传递给 b64encode,然后必须将生成的字节字符串解码为纯字符串,然后才能放入标题中。下面的代码做了我需要的:

import httplib2, base64

cred = base64.b64encode("{0}:{1}".format(
    <user>, <api_token>).encode('utf-8')).decode()
headers = {'Authorization': "Basic %s" % cred}
h = httplib2.Http('.cache')
response, content = h.request("http://my.jenkins.server/job/my_job/enable",
    "GET", headers=headers)
于 2014-03-05T16:26:18.977 回答