我试图在我的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哈希的方式存在问题。我真的不知道该怎么解决这个问题。
任何帮助都很好,
谢啦
使用此处建议的代码,我遇到了与您类似的问题: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。我希望这也能解决你的问题。