GitHub push event signature не совпадает
Я кодирую Webhook для GitHub и реализовал безопасную проверку в 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 events это работает нормально, даже выталкивание новых ветвей работает, но для событий push commits x-hub-signature
и вычисленный хэш из полезной нагрузки не совпадают, поэтому он всегда получает 403 несанкционированных.
Обновить
Я заметил, что для такого рода push-полезных нагрузок коммиты и head_commit добавляются к полезной нагрузке. Я уже пробовал удалить его. коммиты и head_commit от тела, но это не сработало.
Обновить
Для получения дополнительной информации, пожалуйста, просмотрите эти примеры полезных нагрузок. Я также включил url для тестового РЕПО и информацию о токене: https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33
1 ответ:
Кодировка по умолчанию крипто-хэша.update() является двоичным , как подробно описано в ответе на Node JS crypto, не может создавать hmac на символах с акцентами . Это вызывает проблему в полезной нагрузке push-события, которая содержит символ
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
.