无法验证网络钩子 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);
}
我正在尝试使用 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 的评论让我做了一些谷歌搜索,这让我找到了
对于将来发现此问题的任何人:不要使用 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);
}