FIRMA
Verifica que el aviso vino de Cord.
Cada entrega lleva X-Cord-Signature-V1 con una marca de tiempo y el HMAC-SHA256 del cuerpo crudo, firmado con el secreto de tu endpoint. Lo validas en unas pocas líneas antes de procesar el evento, y la marca de tiempo te protege de que alguien reenvíe una entrega vieja.
- X-Cord-Event-Id para deduplicar sin leer el cuerpo
- X-Cord-Attempt dice qué intento de entrega es
- Durante una rotación firma con el secreto nuevo y el anterior
import crypto from 'node:crypto';
// header = req.headers['x-cord-signature-v1'], rawBody = cuerpo sin parsear
export function verifyCord(rawBody, header, secret) {
const parts = header.split(',');
const t = parts.find((p) => p.startsWith('t='))?.slice(2);
if (!t || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = crypto.createHmac('sha256', secret)
.update(`${t}.${rawBody}`).digest();
// durante una rotación llegan dos v1: basta con que uno cuadre
return parts.filter((p) => p.startsWith('v1=')).some((p) => {
const got = Buffer.from(p.slice(3), 'hex');
return got.length === expected.length && crypto.timingSafeEqual(got, expected);
});
}