我正在编写一个 GitHub Webhook,并在 KOA.js
中实现了安全验证:
function sign(tok, blob) {
var hmac;
hmac = crypto
.createHmac('sha1', tok)
.update(blob)
.digest('hex');
return 'sha1=' + hmac;
}
...
key = this.request.headers['x-hub-signature'];
blob = JSON.stringify(this.request.body);
if (!key || !blob) {
this.status = 400;
this.body = 'Bad Request';
}
lock = sign(settings.api_secret, blob);
if (lock !== key) {
console.log(symbols.warning, 'Unauthorized');
this.status = 403;
this.body = 'Unauthorized';
return;
}
...
对于 pull_requests 和 create 事件,这样做是可以的,甚至推送新分支也可以,但是对于推送提交事件,x-hub-signature
和从有效载荷计算出的哈希值不匹配,所以它总是得到 403 未授权错误。
更新
我注意到对于这种类型的推送有效载荷,提交和 head_commit 被添加到了有效载荷中。我尝试从正文中删除提交和 head_commit,但这没有起作用。
更新
有关更多信息,请查看这些示例有效载荷。我还包括了测试仓库和令牌信息的 URL:https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33
this.request.body
不已经是一个字符串了吗?如果是的话,它将被双重编码(例如,三个字符的字符串foo
将被 JSON 编码为五个字符的字符串"foo"
)。看看typeof this.request.body
会产生什么结果。 - apsillersx-hub-signature
的值,你计算出的HMAC和密钥?显然,这应该来自一个测试存储库。 - javabrett