我需要對HTTP服務器執行搶先式基本身份驗證,即馬上進行身份驗證而無需等待401響應。這可以通過httplib2完成嗎?我可以使用httplib2進行搶先認證嗎?
編輯:
我解決它通過增加一個Authorization頭的請求,作爲公認的答案提示:
headers["Authorization"] = "Basic {0}".format(
base64.b64encode("{0}:{1}".format(username, password)))
我需要對HTTP服務器執行搶先式基本身份驗證,即馬上進行身份驗證而無需等待401響應。這可以通過httplib2完成嗎?我可以使用httplib2進行搶先認證嗎?
編輯:
我解決它通過增加一個Authorization頭的請求,作爲公認的答案提示:
headers["Authorization"] = "Basic {0}".format(
base64.b64encode("{0}:{1}".format(username, password)))
這也適用於內置的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
我意識到這是老了,但我想我會在解決方案拋出,如果你使用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)
這也適用於內置'httplib',看到我的回答如下。 –
以及我會+1,如果你已經包括你的Python腳本進行身份驗證對詹金斯/哈德森 – Toskan