2011-08-16 56 views
5

我需要對HTTP服務器執行搶先式基本身份驗證,即馬上進行身份驗證而無需等待401響應。這可以通過httplib2完成嗎?我可以使用httplib2進行搶先認證嗎?

編輯:

我解決它通過增加一個Authorization頭的請求,作爲公認的答案提示:

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

這也適用於內置'httplib',看到我的回答如下。 –

+0

以及我會+1,如果你已經包括你的Python腳本進行身份驗證對詹金斯/哈德森 – Toskan

回答

4

添加適當形成的「授權」頭到你的初始請求。

+1

你能舉例說明嗎?我不是HTTP專家。 – aknuds1

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 
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) 
相關問題