我被要求处理一个外部 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."}
。显然我在这里做错了什么,但我认为我知道的不够多,无法知道我做错了什么,如果这是有道理的话。有任何想法吗?