我正在处理来自github的传入Webhook,并希望验证x-hub-signature。我正在使用hmac
来散列“秘密”,然后比较两个哈希值。问题是他们从不匹配。这是我的设置:
router.route("/auth")
.post((req, res) => {
var hmac = crypto.createHmac("sha1", process.env.WEBHOOK_SECRET);
var calculatedSignature = "sha1=" + hmac.update(JSON.stringify(req.body)).digest("hex");
console.log(req.headers["x-hub-signature"] === calculatedSignature); // Returns false
console.log(req.headers["x-hub-signature"]) // => sha1=blablabla
console.log(calculatedSignature) // => sha1=foofoofoo
res.end();
});
我已经尝试了一切,但无法使其发挥作用。想知道hmac.update()
是否应该保留另一个参数而不是JSON.stringify(req.body)
。有谁知道为什么他们不匹配?
答案 0 :(得分:0)
所以问题在于webhook的设置。内容格式设置为application / x-www-form-urlencoded,由于某种原因,对x-hub-signature进行了不同的散列。我刚把它改成了application / json,然后就运行了!
答案 1 :(得分:0)
如果webhook Content-Type设置为application/x-www-url-encoded
,则需要使用字符串来检查HMAC是
"payload=" + query_encoded_payload
。
例如golang
payloadForm := r.PostFormValue("payload")
escaped := url.QueryEscape(payloadForm) # ex. http://www.url-encode-decode.com/
checkMe := "payload=" + escaped