提问者:小点点

在节点上出现匹配WooCommerce WebHook签名的问题。JS公司


我试图在我的Node.js网站上验证来自WooCommerce的网络钩子交易。但是我无法获得匹配的2个字符串。

我可以看到php签名是用以下代码生成的,源代码可以在这里查看WooCommerce源代码。

base64_encode( hash_hmac( $hash_algo, $payload, $this->get_secret(), true ) ));

我注意到,如果我在hash_hmac上关闭true,我可以让2个系统创建匹配,但是我宁愿不编辑WooCommerce的核心,所以我想知道是否有什么我在这里错过了?

在我的示例中,我确实编辑了核心,并强制有效负载如下,这样我就可以轻松地尝试匹配这两个系统

payload = '{"id":1,"etc":2,"host":"http:/\/localhost\/view-order\/8"}'
secret = 'welcome'

节点中的我的代码。Js如下所示。

var crypto = require('crypto');    

hmac = crypto.createHmac('sha256', secret);
hmac.setEncoding('binary');
hmac.write(payload);
hmac.end();
hash = hmac.read();

result = base64.encode(hash);

console.log(result);

如果我从“主机”JSON中删除url,那么它确实可以工作,这与它的转义方式有关吗?我认为这可能是PHP和node执行SHA256哈希的方式存在问题。我真的不知道该怎么解决这个问题。

任何帮助都很好,

谢啦


共1个答案

匿名用户

使用此处建议的代码,我遇到了与您类似的问题:WooCommerce的SHA256 webhook签名从不验证

var processWebHookSignature = function (secret, body, signature) {
  signatureComputed = crypto.createHmac('SHA256', secret)
  .update(new Buffer(JSON.stringify(body), 'utf8'))
  .digest('base64');

  return ( signatureComputed === signature ) ? true : false;
}

(其中body来自req.body)。

当我改变获取原始身体的方式时,这才开始对我起作用。我使用bodyParser中间件获得它:
应用程序。使用(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}}))
(如中所述:https://github.com/expressjs/body-parser/issues/83#issuecomment-80784100)

因此,现在我不使用新的缓冲区(JSON.stringify(body),'utf8')而是使用req。我希望这也能解决你的问题。