Estoy codificando un Webhook para GitHub e implementé una verificación segura en KOA.js como:
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; } ... para pull_requests y crear eventos, esto funciona bien, incluso empujar nuevas ramas funciona, pero para eventos de confirmación de empuje, la x-hub-signature y el hash calculado de la carga útil no coinciden, por lo que siempre obtiene 403 no autorizado.
Actualizar
He notado que para este tipo de cargas útiles push, las confirmaciones y head_commit se agregan a la carga útil. Intenté eliminar las confirmaciones y el head_commit del cuerpo, pero no funcionó.
Actualizar
Para obtener más información, consulte estos ejemplos de cargas útiles. También incluí la URL para el repositorio de prueba y la información del token: https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33
La codificación predeterminada de Crypto hash.update() es binaria , como se detalla en la respuesta a Node JS crypto, no puede crear hmac en caracteres con acentos . Esto provoca un problema en la carga útil del evento push, que contiene el carácter U+00E1 LETRA A MINÚSCULA LATINA CON AGUDO en Hernández cuatro veces, y los servicios de GitHub están codificando la carga útil como utf-8 . Tenga en cuenta que su Gist muestra estos codificados incorrectamente en ISO-8859-1, así que también asegúrese de que está manejando la codificación de caracteres de la solicitud entrante correctamente (pero esto debería suceder de manera predeterminada).
Para solucionar esto, debe usar un Buffer :
hmac = crypto.createHmac('sha1', tok).update(new Buffer(blob, 'utf-8')).digest('hex'); ... o pase la codificación directamente para update :
hmac = crypto.createHmac('sha1', tok).update(blob, 'utf-8').digest('hex'); Luego se calculará el hash correcto de 7f9e6014b7bddf5533494eff6a2c71c4ec7c042d .