我需要访问一个使用JSON Web令牌作为其身份验证方法的API。有没有一种好方法可以使用python代码步骤创建此令牌,然后将该令牌作为标头添加到自定义请求网络挂钩步骤中?
答案 0 :(得分:4)
我使用API进行身份验证的经验一直是使用简单的API key方法。因此,我首先阅读了您的问题,但并没有完全理解。我决定做一些研究,并希望在此过程中学到一些东西,我当然做到了。我在下面分享我的发现并回答:
对于初学者来说,我开始阅读JSON Web令牌(JWT),这使我进入JWT网站,这是一个很好的资源。它非常清楚地阐明了构成JWT的组件以及如何格式化它们,我强烈建议您看看。
在JWT网站上,我发现JWT由三个部分组成:
以上所有三个组合构成了正确格式的JWT。幸运的是,JWT网站上有一个针对Python的库列表。不幸的是,Zapier代码模块提供的香草Python中没有这些第三方库。要做到这一点,需要阅读一些source code并利用我们所拥有的库。因此,经过几个小时的反复试验,我能够提出以下解决方案来生成格式正确的JWT:
import hashlib
import hmac
import requests
from base64 import urlsafe_b64encode
def base64url_encode(payload):
if not isinstance(payload, bytes):
payload = payload.encode('utf-8')
encode = urlsafe_b64encode(payload)
return encode.decode('utf-8').rstrip('=')
def generate_JWT(header, payload, secret):
encoded_header = base64url_encode(header)
encoded_payload = base64url_encode(payload)
signature = hmac.new(secret,
encoded_header + "." + encoded_payload,
hashlib.sha256)
encoded_signature = base64url_encode(signature.digest())
return encoded_header + "." + encoded_payload + "." + encoded_signature
def get_request(url, jwt):
headers = {
"Authorization" : "Bearer " + jwt
}
result = requests.get(url, headers=headers)
return result
secret = "yoursecrettoken"
header = '{"alg":"HS256","typ":"JWT"}'
payload = '{"sub":"1234567890","name":"John Doe","iat":1516239022}'
jwt = generate_JWT(header, payload, secret)
response = get_request("https://SomeApiEndpoint.com/api/", jwt)
您可以对照JWT的调试器here测试其输出。
注意:为使标头和有效负载对象的编码正常工作,您必须将它们转换为字符串对象。我尝试通过调用JSON.dumps()函数并传递字典对象来做到这一点,但是当我对返回值进行编码时,它们与JWT调试器上显示的不匹配。我能找到的唯一解决方案是将字典对象括在引号中,并确保其中没有空格。
因此,有了JWT,您就可以在Zapier Webhooks定制获取请求步骤中使用它,或者可以保存zap并使用Python的request library在相同的代码模块中发送请求,就像我在我的笔记本中一样代码示例。
感谢您的学习机会,希望对您有所帮助。