无法验证网络钩子 Node.js

Can't verify webhook Node.js

我正在尝试使用 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 webhooks 使用 MD5 - 参见 https://docs.patreon.com/#webhooks

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

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

知道发生了什么事吗?

所以@gaiazov 的评论让我做了一些谷歌搜索,这让我找到了 by Karl Reid which led me to 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);
}