簡體   English   中英

我可以使用 httplib2 進行搶先式身份驗證嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM