Zendesk:使用Python 3.2.2'请求'模块和API令牌进行身份验证

Kud*_*dzu 2 python json subclass zendesk python-requests

我被要求处理外部REST API(实际上是Zendesk),其凭据需要格式化为{email}/token:{security_token}- 单个值而不是通常的用户名/密码对.我正在尝试使用Python requests模块执行此任务,因为它是Pythonic并且不会伤害我的大脑,但我不确定如何格式化身份验证凭据.Zendesk文档仅提供使用的访问示例curl,我不熟悉.

这是我目前的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
Run Code Online (Sandbox Code Playgroud)

我不确定是否需要各种编码,但这就是有人在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
Run Code Online (Sandbox Code Playgroud)

这称为:

credentials = ZDTokenAuth(zd_username,zd_apitoken)
zd = ZDStats(credentials)
users = zd.testCredentials()
print(users.status_code)
print(users.text)
Run Code Online (Sandbox Code Playgroud)

我回来的状态代码是a 401,而文本很简单{"error":"Couldn't authenticate you."}.显然我在这里做错了,但我认为我不知道我知道它做错了什么,如果这是有道理的.有任何想法吗?

mat*_*ata 8

你缺少的是auth类型.您的Authorization标题应该像这样创建:

r.headers['Authorization'] = b"Basic " + base64.b64encode(auth_string)
Run Code Online (Sandbox Code Playgroud)

您还可以auth使用以下参数实现相同的元组传递:

requests.get(url, auth=(username+"/token", token))
Run Code Online (Sandbox Code Playgroud)