我被要求处理外部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
我不确定是否需要各种编码,但这就是有人在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."}
。显然我在这里做错了,但我认为我不知道我知道它做错了什么,如果这是有道理的。有什么想法吗?
答案 0 :(得分:7)
您缺少的是auth类型。您的Authorization
标题应按如下方式创建:
r.headers['Authorization'] = b"Basic " + base64.b64encode(auth_string)
您还可以使用auth
参数通过元组实现相同的传递:
requests.get(url, auth=(username+"/token", token))