Подтвердить что ты не робот

Сигнатура события Github не соответствует

Я кодирую 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 и создания событий, это работает нормально, даже нажатие новых ветвей работает, но для push совершает события x-hub-signature, а вычисленный хэш из полезной нагрузки не соответствует, поэтому он всегда получает 403 неавторизованных.

Обновление

Я заметил, что для такого рода push-полезных нагрузок коммиты и head_commit добавляются в полезную нагрузку. Я попытался удалить коммиты и head_commit из тела, но это не сработало.

Обновление

Для получения дополнительной информации ознакомьтесь с этими примерами полезных нагрузок. Я также включил URL для тестового репо и токенов: https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33

4b9b3361

Ответ 1

стандартная кодировка Crypto hash.update() является двоичной, как указано в ответе Node JS crypto, не может создавать hmac на символах с акцентами. Это вызывает проблему в вашей полезной нагрузке push-event, которая содержит символ U+00E1 LATIN SMALL LETTER A WITH ACUTE в 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.