【发布时间】:2020-06-08 06:30:23
【问题描述】:
我正在尝试保护我的 Zoho webhook 实施。我关注了这个文档:https://www.zoho.com/subscriptions/kb/webhooks/securing-webhooks.html
我并不清楚该怎么做,但我很确定最后我还是按照他们说的做了。
我没有任何查询参数。 该格式只是一个默认的 JSON 有效负载 NO 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% 确定这个秘密是正确的,我检查了三次。
有没有人看到这里出了什么问题或者有一个有效的 NodeJS 实现来做这件事?
提前致谢!
【问题讨论】:
标签: node.js webhooks signature hmac zoho