2013-07-02 25 views
2

我一直在問到應對外部REST API(的Zendesk的,其實)的Python 3.2.2的要求「模塊和API令牌其憑據需要被格式化爲{email}/token:{security_token} - 一個值,而比通常的用戶名/密碼對。我試圖使用Python requests模塊完成這個任務,因爲它是Python的,並且不傷害我的大腦還算可以,但我不知道如何格式化認證證書。該文件的Zendesk只使用curl,這我不熟悉可以訪問的例子。的Zendesk:驗證使用

以下是我目前有requests.auth.AuthBase子類:

class ZDTokenAuth(requests.auth.AuthBase): 
    def __init__(self,username,token): 
     self.username = username 
     self.token = token 

    def __call__(self,r): 
     auth_string = self.username + "/token:" + self.token 
     auth_string = auth_string.encode('utf-8') 
     r.headers['Authorization'] = base64.b64encode(auth_string) 
     return r 

我不知道的是,各種編碼是必需的,但是這是一個人如何做到了在github上(https://github.com/skipjac/Zendesk-python-api/blob/master/zendesk-ticket-delete.py),所以爲什麼不呢?我已經嘗試過,沒有編碼,當然 - 相同的結果。

這裏的類和方法,我用來測試:

class ZDStats(object): 
    api_base = "https://mycompany.zendesk.com/api/v2/" 

    def __init__(self,zd_auth): 
     self.zd_auth = zd_auth # this is assumed to be a ZDTokenAuth object 

    def testCredentials(self): 
     zd_users_url = self.api_base + "users.json" 
     zdreq = requests.get(zd_users_url, auth=self.zdauth) 
     return zdreq 

這就是所謂的有:

credentials = ZDTokenAuth(zd_username,zd_apitoken) 
zd = ZDStats(credentials) 
users = zd.testCredentials() 
print(users.status_code) 
print(users.text) 

我找回狀態代碼是一個401,和文字簡直就是{"error":"Couldn't authenticate you."}。顯然,我在這裏做得不對,但我不認爲我非常清楚,知道什麼是我做錯了,如果是有道理的。有任何想法嗎?

回答

6

你錯過了什麼是認證類型。

r.headers['Authorization'] = b"Basic " + base64.b64encode(auth_string) 

您也可以實現通過一個元組相同的傳球一樣auth參數有::你Authorization頭應該這樣創建

requests.get(url, auth=(username+"/token", token)) 
+0

這做到了,尤其是,只需追加'「/令牌「'對基本的HTTP認證元組中的用戶名完美工作。謝謝你的幫助! – Kudzu