[英]Can I do preemptive authentication with httplib2?
我需要對 HTTP 服務器執行搶先式基本身份驗證,即立即進行身份驗證,而無需等待 401 響應。 這可以用httplib2完成嗎?
編輯:
我通過在請求中添加 Authorization header 來解決它,如接受的答案中所建議的那樣:
headers["Authorization"] = "Basic {0}".format(
base64.b64encode("{0}:{1}".format(username, password)))
在您的初始請求中添加適當格式的“授權”header。
這也適用於內置的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
我意識到這已經過時了,但是我想如果您將 Python 3 與 httplib2 一起使用,我會提出解決方案,因為我無法在其他任何地方找到它。 我還在為每個 Jenkins 用戶使用 API 令牌對 Jenkins 服務器進行身份驗證。 如果您不關心 Jenkins,只需將實際用戶密碼替換為 API 令牌即可。
b64encode 需要一個 ASCII 字符的二進制字符串。 對於 Python 3,如果傳入純字符串,則會引發 TypeError。為了解決此問題,header 的“user:api_token”部分必須使用“ascii”或“utf-8”進行編碼,並傳遞給 b64encode,那么生成的字節字符串必須在放入 header 之前解碼為純字符串。 下面的代碼做了我需要的:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.