Python中文
首页
教程
问答
标签
搜索
登录
注册
散列格子请求主体Webhook
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我正在尝试验证Plaid的<a href="https://plaid.com/docs/#webhook-verification" rel="nofollow noreferrer">API</a>发送的webhook。每个webhook请求都会发送一个“plaid验证”头,它是一个JSON Web令牌</p> <p>验证所需的步骤包括:</p> <ol> <li>从请求头中提取JWT</li> </ol> <p><code>signed_jwt = eyJhbGciOiJFUzI1NiIsImtpZCI6IjZjNTUxNmUxLTkyZGMtNDc5ZS1hOGZmLTVhNTE5OTJlMDAwMSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1OTA4ODcwMDEsInJlcXVlc3RfYm9keV9zaGEyNTYiOiJiNjNhMDdiNTQ3YjAwZjk5MjU0N2Y2YmJjOGQ5YWNjNjFhOGNjZWUxMzhiYzgyZjQ0YTZiYWEwOTY4M2E1ZDBmIn0.OOKvIihgqCj7Qrb2bmz7T3t7uK-0JyjiEqL2s1kWeJBM4MMmjaHKK8GmU_z91QolBWMzvPgs718EElY-rE3cwQ</code></p> <ol start=“2”> <li>在不验证签名的情况下提取JWT头值,如下所示:</li> </ol> <pre><code> { "alg": "ES256", "kid": "6c5516e1-92dc-479e-a8ff-5a51992e0001", "typ": "JWT" } </code></pre> <ol start=“3”> <li>提取<code>kid</code>并发布到<code>/webhook_verification_key/get</code></li> </ol> <pre><code> POST /webhook_verification_key/get { "client_id": "MY_CLIENT_ID" "secret": "MY_SECRET_ID" "key_id": "6c5516e1-92dc-479e-a8ff-5a51992e0001" } </code></pre> <p>答复是:</p> <pre><code>{ "key": { "alg": "ES256", "created_at": 1560466143, "crv": "P-256", "expired_at": null, "kid": "6c5516e1-92dc-479e-a8ff-5a51992e0001", "kty": "EC", "use": "sig", "x": "35lvC8uz2QrWpQJ3TUH8t9o9DURMp7ydU518RKDl20k", "y": "I8BuXB2bvxelzJAd7OKhd-ZwjCst05Fx47Mb_0ugros" }, "request_id": "HvfCtrDLG1ihcp7" } </code></pre> <ol start=“4”> <li>将<code>key</code>解释为JSON Web密钥,验证JSON Web密钥的签名是否有效,并提取有效负载(使用jose python库)</li> </ol> <pre><code>claims = jwt.decode(signed_jwt, key, algorithms=['ES256']) claims = { "iat": 1590887001, "request_body_sha256": "b63a07b547b00f992547f6bbc8d9acc61a8ccee138bc82f44a6baa09683a5d0f" } </code></pre> <ol start=“5”> <li>计算请求正文的SHA-256并确保它与<code>claims['request_body_sha256']</code>匹配:</li> </ol> <p>Body位于Body.json文件中</p> <pre><code>{ "error": null, "item_id": "yxQbxDjnD8hr69pKbQpbcKeVn3GL9QuyA7NV3", "new_transactions": 390, "webhook_code": "HISTORICAL_UPDATE", "webhook_type": "TRANSACTIONS" } </code></pre> <p>计算body.json的SHA-256</p> <pre><code>f = open('body.json') body = json.load(f) f.close() m = hashlib.sha256() m.update(json.dumps(body).encode()) body_hash = m.hexdigest() print(body_hash) body_hash = 'efbb5274864518f7eb3834125d9bcdb95fb03066d3d1bed3ebcc6163d8dc3579' </code></pre> <p>上例中的body散列不等于从Plaid接收的body散列。这里可能有两个问题:</p> <ol> <li>Plaid未发送正确的正文哈希(不太可能)</li> <li>我用来散列主体的散列方法与Plaid的方法不同</li> </ol> <p>这里有我遗漏的东西吗?也许请求主体在我这边的编码不同?我在产品中使用Node.js和Express,但是我制作了一个Python脚本来遵循Plaid概述的方法<a href="https://support.plaid.com/hc/en-us/articles/360041410794" rel="nofollow noreferrer">here</a>,但是我仍然没有得到正确的哈希。老实说,我没有主意了</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>我与我们的支持团队分享了这一点,他们发现了这个问题。这似乎是空白的问题。如果修改body.json,使每一新行上的每个“tab”有2个空格,它将生成正确的哈希</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何为此数据帧创建散点图?
6 回答
如何为此编写Django模板
10 回答
如何为此表达式编写正则表达式?
6 回答
如何为步进电机选择合适的值?
5 回答
如何为每15分钟间隔的日期时间行(在新列中)添加标签?
4 回答
如何为每一列创建汇总表?
4 回答
如何为每一组groupbyPandas做滚动“得到假人”
7 回答
如何为每一行分别运行函数(python)?
7 回答
如何为每一行生成一个随机数?
4 回答
如何为每一轮将pytorch模型输出存储到numpy
6 回答
如何为每个.py-fi文件创建单独的zip文件
10 回答
如何为每个<li class=”“><a>找到最近的上述同级<li>?
4 回答
如何为每个CSV列生成特定的文件?
9 回答
如何为每个csv文件使用read_csv,即使它是空的?PythonPandas
7 回答
如何为每个CSV文件创建单独的Pandas数据帧并给它们起有意义的名称?
5 回答
如何为每个datetime和每个id创建一行?
2 回答
如何为每个Django型号选择赋予不同的颜色
6 回答
如何为每个Django模型实例安排一个周期性的芹菜任务?
8 回答
如何为每个Django视图设置一个装饰器?
8 回答
如何为每个for循环迭代分配变量
6 回答