我使用 API 进行身份验证的经验是使用简单的API key https://zapier.com/engineering/apikey-oauth-jwt/方法。因此,我第一次读到你的问题并没有完全理解。我决定做一些研究,希望能从中学到一些东西,我确实做到了。我在下面分享我的发现和答案:
首先,我开始阅读 JSON Web Tokens(JWT),这将我引向JWT https://jwt.io/introduction/网站,这是一个很好的资源。它非常清楚地说明了构成 JWT 的组件以及它们需要如何格式化,我强烈建议您查看一下。
从 JWT 网站我发现 JWT 由三个组件组成:
- Base64 URL 安全编码标头。
- Base64 URL 安全编码的有效负载。
- Base64 URL 安全编码签名。
上述所有三个组合形成了格式正确的 JWT。幸运的是,JWT 网站有一个为 Python 制作的库列表。不幸的是,这些第三方库在 Zapier 代码模块提供的普通 Python 中都不可用。要完成此任务需要阅读一些源代码 https://github.com/latchset/jwcrypto/tree/master/jwcrypto并利用我们现有的库。因此,经过几个小时和大量的试验和错误,我能够想出以下解决方案来生成格式正确的 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 https://jwt.io/.
Note:为了使标头和有效负载对象的编码正常工作,您必须将它们转换为字符串对象。我尝试通过调用 JSON.dumps() 函数并传递字典对象来执行此操作,但是当我对返回值进行编码时,它们与 JWT 调试器上显示的内容不匹配。我能找到的唯一解决方案是将字典对象放在引号中并确保其中没有空格。
因此,有了 JWT,您就可以在 Zapier Webhooks 自定义获取请求步骤中使用它,或者您可以保存 zap 并使用 Python 在同一代码模块中发送请求请求库 http://docs.python-requests.org/en/master/正如我在代码示例中所示。
感谢您提供学习机会,希望对您有所帮助。