【问题标题】:Zoho subscription validate webhook signature NodeJSZoho 订阅验证 webhook 签名 NodeJS
【发布时间】: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


    【解决方案1】:

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

    app.use(bodyParser.json());
    

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

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

    例如,如果您的货币是Euro,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 传递的签名相对应!

    【讨论】:

      猜你喜欢
      • 2016-03-16
      • 2019-01-17
      • 1970-01-01
      • 2020-07-17
      • 2021-12-25
      • 2022-06-28
      • 2018-02-01
      • 2019-05-11
      • 2020-08-22
      相关资源
      最近更新 更多