0

我正在尝试使用 Node.js 验证来自 Patreon 的 webhook 签名。这是我的代码:

const crypto = require("crypto");

...

function validateJsonWebhook(request) {
  const secret = SECRET_KEY_GIVEN_BY_PATREON;

  const hash = crypto.createHmac("md5", secret)
      .update(JSON.stringify(request.body))
      .digest("hex");

  if (request.header("x-patreon-signature") === hash) {
    return true;
  } else {
    return false;
  }
}

Patreon webhook 使用 MD5 - 请参阅https://docs.patreon.com/#webhooks

我已经多次验证了密钥,所以我知道这不是问题。

"request.header("x-patreon-signature")" 和 "hash" 都返回正确的格式(即它们都是 32 位字母数字组合),但它们只是不匹配。

知道发生了什么吗?

4

1 回答 1

2

所以@gaiazov 的评论让我做了一些谷歌搜索,这让我看到了 Karl Reid关于Stripe 验证 web-hook 签名 HMAC sha254 HAPI.js的前两条评论,这让我去了https://github.com/stripe/stripe-node /issues/331#issuecomment-314917167

对于将来发现此问题的任何人:不要使用 JSON.stringify(request.body) - 请改用 request.rawBody,因为签名是根据原始 JSON 计算的。我觉得应该在 Patreon 的文档中强调这一点,因为我发现的所有示例都使用了我最初发布的代码。我的新工作代码如下(我在最后清理了“if (request.header("x-patreon-signature") === hash)”部分):

const crypto = require("crypto");

...

function validateJsonWebhook(request) {
  // Secret key given by Patreon.
  const secret = patreonSecret;

  const hash = crypto.createHmac("md5", secret)
      .update(request.rawBody)
      .digest("hex");

  return (request.header("x-patreon-signature") === hash);
}
于 2021-06-29T13:56:17.243 回答