2

我被要求处理一个外部 REST API(实际上是 Zendesk 的),其凭据需要被格式化为{email}/token:{security_token}——一个单一的值,而不是通常的用户名/密码对。我正在尝试将 Pythonrequests模块用于此任务,因为它是 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

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

我得到的状态码是 a 401,文本是简单的{"error":"Couldn't authenticate you."}。显然我在这里做错了什么,但我认为我知道的不够多,无法知道我做错了什么,如果这是有道理的话。有任何想法吗?

4

1 回答 1

9

您缺少的是身份验证类型。您的Authorization标头应该像这样创建:

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

您还可以通过以下方式通过元组作为auth参数实现相同的传递:

requests.get(url, auth=(username+"/token", token))
于 2013-07-02T14:21:53.777 回答