【发布时间】:2019-04-06 01:32:46
【问题描述】:
我需要访问一个使用 JSON Web 令牌作为其身份验证方法的 API。有没有一种好方法可以使用 python 代码步骤创建此令牌,然后将该令牌作为标头添加到自定义请求 webhook 步骤中?
【问题讨论】:
我需要访问一个使用 JSON Web 令牌作为其身份验证方法的 API。有没有一种好方法可以使用 python 代码步骤创建此令牌,然后将该令牌作为标头添加到自定义请求 webhook 步骤中?
【问题讨论】:
我使用 API 进行身份验证的经验是使用简单的 API key 方法。因此,我首先阅读了您的问题并没有完全理解。我决定做一些研究,并希望在此过程中学到一些东西,我当然做到了。我在下面分享我的发现和答案:
对于初学者,我开始阅读 JSON Web Tokens(JWT),它引导我访问 JWT 网站,这是一个极好的资源。它非常清楚地说明了组成 JWT 的组件以及它们需要如何格式化,我强烈建议您看看。
从 JWT 网站我发现一个 JWT 由三个组件组成:
以上所有三个组合形成了正确格式的 JWT。幸运的是,JWT 网站上有一个为 Python 制作的库列表。不幸的是,Zapier 代码模块提供的 vanilla 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 在同一代码模块中发送请求,就像我在代码示例中所做的那样.
感谢提供学习机会,希望对您有所帮助。
【讨论】: