将Zapier自定义请求Webhook与JSON Web令牌一起使用

时间:2018-11-01 19:08:56

标签: python jwt zapier

我需要访问一个使用JSON Web令牌作为其身份验证方法的API。有没有一种好方法可以使用python代码步骤创建此令牌,然后将该令牌作为标头添加到自定义请求网络挂钩步骤中?

1 个答案:

答案 0 :(得分:4)

我使用API​​进行身份验证的经验一直是使用简单的API key方法。因此,我首先阅读了您的问题,但并没有完全理解。我决定做一些研究,并希望在此过程中学到一些东西,我当然做到了。我在下面分享我的发现并回答:

对于初学者来说,我开始阅读JSON Web令牌(JWT),这使我进入JWT网站,这是一个很好的资源。它非常清楚地阐明了构成JWT的组件以及如何格式化它们,我强烈建议您看看。

在JWT网站上,我发现JWT由三个部分组成:

  1. base64 URL安全编码的标头。
  2. base64 URL安全编码的有效载荷。
  3. base64 URL安全编码签名。

以上所有三个组合构成了正确格式的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在相同的代码模块中发送请求,就像我在我的笔记本中一样代码示例。

感谢您的学习机会,希望对您有所帮助。