Github推送事件签名don't match
Github push event signature don't match
我正在为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事件,这个工作正常,甚至push新的分支工作,但是对于push提交事件,x-hub-signature
和从负载计算的哈希不匹配,所以它总是得到403 unauthorized。
我注意到对于这种推送有效负载,提交和head_commit被添加到有效负载中。我试过从主体中删除提交和head_commit,但它不起作用。
有关更多信息,请查看这些示例有效负载。我还包含了测试repo的url和令牌信息:https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33
Crypto hash.update()的默认编码是二进制的,详见Node JS Crypto的答案,不能在带有重音的字符上创建hmac。这导致您的推事件有效载荷的问题,其中包含字符U+00E1
拉丁小写字母a与急性在Hernández
四次,GitHub服务是哈希有效载荷作为utf-8
编码。请注意,您的Gist在ISO-8859-1中显示了这些错误编码,因此还要确保您正在正确处理传入请求的字符编码(但这应该在默认情况下发生)。
要解决这个问题,您需要使用Buffer
:
hmac = crypto.createHmac('sha1', tok).update(new Buffer(blob, 'utf-8')).digest('hex');
…或者直接将编码传递给update
:
hmac = crypto.createHmac('sha1', tok).update(blob, 'utf-8').digest('hex');
计算7f9e6014b7bddf5533494eff6a2c71c4ec7c042d
的正确哈希值
相关文章:
- 元素在我的代码中不会.fadeTo.Don'I don’我不知道;s错误的JavaScript、JQuery、H
- Don'不允许将焦点集中在自动完成的选择上
- javascript如果图像不存在don't加载它
- append元素don'不要在提交时出现
- AngularJS指令部分应用的函数don'不起作用
- Don'我不明白为什么我的setInterval+jQuery;不起作用
- 我没有'I don’我不理解for在循环中的用途
- jQuery 1.7.2:.on()在一个页面上工作;Don’别再干别的了
- AngularJs|Don'在成功加载所有指令htmls之前,不显示页面
- node.js是否具有'match()'方法如果是,语法是什么
- Codeacademy Javascript..好的!/输出正确,但codeacademy没有;I don’我不喜欢
- Don't工作警报代码jQuery
- 如何实施“;Don'不要再给我看了”;在GWT中
- AngularJS routeprovider赢得'Don’我什么都不做
- Mediawiki皮肤创建-Javascript don'Don’t get load
- Dropit下拉列表没有'Don’不要躲在老鼠屋
- Regex Replace仅适用于Last Match
- 链接don'由于Javascript悬停效果,无法在移动设备上工作
- Jquery live()绑定没有'I don’我对某些元素不感兴趣
- Github推送事件签名don't match