gpt4 book ai didi

python - 散列格子请求正文 Webhook

转载 作者:行者123 更新时间:2023-12-03 23:34:31 25 4
gpt4 key购买 nike

我正在尝试验证从 Plaid 发送的 webhook API .每个 webhook 请求都带有一个“plaid-verification” header ,它是一个 JSON Web token 。

验证所需的步骤是:

  • 从请求头中提取 JWT
  • signed_jwt = eyJhbGciOiJFUzI1NiIsImtpZCI6IjZjNTUxNmUxLTkyZGMtNDc5ZS1hOGZmLTVhNTE5OTJlMDAwMSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1OTA4ODcwMDEsInJlcXVlc3RfYm9keV9zaGEyNTYiOiJiNjNhMDdiNTQ3YjAwZjk5MjU0N2Y2YmJjOGQ5YWNjNjFhOGNjZWUxMzhiYzgyZjQ0YTZiYWEwOTY4M2E1ZDBmIn0.OOKvIihgqCj7Qrb2bmz7T3t7uK-0JyjiEqL2s1kWeJBM4MMmjaHKK8GmU_z91QolBWMzvPgs718EElY-rE3cwQ
  • 在不验证签名的情况下提取 JWT header 值,如下所示:
  •     {
    "alg": "ES256",
    "kid": "6c5516e1-92dc-479e-a8ff-5a51992e0001",
    "typ": "JWT"
    }
  • 提取 kid并发布到 /webhook_verification_key/get
  •     POST /webhook_verification_key/get
    {
    "client_id": "MY_CLIENT_ID"
    "secret": "MY_SECRET_ID"
    "key_id": "6c5516e1-92dc-479e-a8ff-5a51992e0001"
    }

    回应是:
    {
    "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"
    }
  • 翻译key作为 JSON Web Key,验证 JSON Web Key 的签名是否有效,并提取有效负载(使用 jose python 库)
  • claims = jwt.decode(signed_jwt, key, algorithms=['ES256'])

    claims = {
    "iat": 1590887001,
    "request_body_sha256": "b63a07b547b00f992547f6bbc8d9acc61a8ccee138bc82f44a6baa09683a5d0f"
    }
  • 计算请求正文的 SHA-256 并确保它匹配 claims['request_body_sha256'] :

  • 正文在文件 body.json 中
    {
    "error": null,
    "item_id": "yxQbxDjnD8hr69pKbQpbcKeVn3GL9QuyA7NV3",
    "new_transactions": 390,
    "webhook_code": "HISTORICAL_UPDATE",
    "webhook_type": "TRANSACTIONS"
    }

    计算 body.json 的 SHA-256
    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'

    上例中的正文哈希不等于从 Plaid 收到的正文哈希。这里有两个可能的问题:
  • Plaid 没有发送正确的正文哈希(不太可能)
  • 我用来散列正文的散列方法与 Plaid 的方法不同

  • 有什么我在这里想念的吗?也许请求正文在我这边的编码方式不同?我在生产中使用 Node.js 和 Express,但我制作了一个 Python 脚本来遵循 Plaid 概述的方法 here ,但我仍然没有得到正确的哈希值。老实说,我没有想法。

    最佳答案

    我与我们出色的支持团队分享了这一点,他们发现了问题。这似乎是空格的问题。如果您将 body.json 修改为每个新行上的每个“tab”有 2 个空格,它将生成正确的哈希值。

    关于python - 散列格子请求正文 Webhook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62117400/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com