gpt4 book ai didi

node.js - Zoho 订阅验证 Webhook 签名 NodeJS

转载 作者:行者123 更新时间:2023-12-02 15:07:51 26 4
gpt4 key购买 nike

我正在尝试保护我的 Zoho Webhook 实现。我关注了这个文档:https://www.zoho.com/subscriptions/kb/webhooks/securing-webhooks.html

我不太清楚该做什么,但我很确定最终我仍然按照他们所说的做了一切。

我没有任何查询参数。该格式只是默认的 JSON 负载,没有 X-WWW-FORM-URLENCODED。

我尝试使用以下代码,但没有得到正确的哈希值。还不清楚我是否应该对默认负载进行排序。根据this答案是,仅对于 form-url-encoded 和查询参数是必需的,但对于纯 JSON 负载则不需要处理。不管怎样,我尝试了两种方法,结果如下:

function computeZohoSignature(query, payload) {
return crypto
.createHmac('sha256', process.env.ZOHO_WEBHOOK_SECRET)
.update(JSON.stringify(payload), 'utf8')
.digest('hex');
}

function validSignature(signatureHash, computedHash) {
return signatureHash.length === computedHash.length
&& crypto.timingSafeEqual(Buffer.from(signatureHash), Buffer.from(computedHash));
}

我还尝试使用以下函数包装有效负载:

function sortObjectByKeys(object) {
if (!isObject(object)) return object;

const sortedObj = {};
Object
.keys(object)
.sort()
.forEach((k) => {
sortedObj[k] = sortObjectByKeys(object[k]);
});

return sortedObj;
}

排序工作正确,我什至尝试只对“根键”进行排序。无论我尝试什么,哈希值都不会相同。是的,我 100% 确定这个 secret 是正确的,我已经检查了三次。

有人看出这里出了什么问题或者有一个可行的 NodeJS 实现吗?

提前致谢!

最佳答案

典型的 Express 设置使用以下配置进行解析:

app.use(bodyParser.json());

此解析器会将请求正文的已解析(对象)内容添加到路由的第一个 req 参数的 body 属性中处理程序 (req, res) => { ... }.

但是,您的 Webhook 的哈希值是根据原始(字符串)负载计算的。虽然您可以使用 JSON.stringify 将解析后的正文转换回字符串,但这可能会导致与原始原始负载不一致。

例如,如果您的货币是欧元,Zoho 将传递编码的“\u20a”作为currency_symbol的值。但是,如果您使用 JSON.stringify 将解析后的正文转换回字符串,您会发现它会生成未编码的 "€"。因为这会导致两个字符串不相同,所以它们不会产生相同的哈希值。

如果不直接访问原始正文,就很难准确检测原始原始正文与 JSON.stringify 结果之间的区别,以及如何将后者转换为它的格式与原始原始主体相同。克服这个问题的最简单方法是使用解析器的 verify 方法,将原始主体添加到例如。路由处理程序的第一个 req 参数的 rawBody 属性,如所述 in this article :

app.use(bodyParser.json({
verify: (req, res, buf) => {
req.rawBody = buf
}
}))

如果您将 req.rawBody 的值分配给 payload,则 computeZohoSignature 方法生成的哈希现在应该与传递的签名相对应通过 Zoho!

关于node.js - Zoho 订阅验证 Webhook 签名 NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60379101/

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