我可以使用httplib2进行抢先认证吗?

时间:2011-08-16 11:27:36

标签: python http-authentication httplib2

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

修改

我通过在请求中添加Authorization标头来解决它,如接受的答案所示:

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

3 个答案:

答案 0 :(得分:4)

在初始请求中添加适当形成的“授权”标题。

答案 1 :(得分:4)

这也适用于内置httplib(对于任何希望最小化第三方库/模块的人)。我使用它来使用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

答案 2 :(得分:1)

我意识到这已经很老了,但是如果你使用带有httplib2的Python 3,我想我会投入解决方案,因为我无法在其他任何地方找到它。我也正在使用每个Jenkins用户的API令牌对Jenkins服务器进行身份验证。如果您不关心Jenkins,只需用实际用户的密码替换API令牌。

b64encode需要一个ASCII字符的二进制字符串。使用Python 3时,如果传入普通字符串,将引发TypeError。为了解决这个问题,必须使用'ascii'或'utf-8'对头文件的“user:api_token”部分进行编码,传递给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)