ASSINATURA
Confirme que o aviso veio do Cord.
Cada entrega leva X-Cord-Signature-V1 com um timestamp e o HMAC-SHA256 do corpo bruto, assinado com o segredo do seu endpoint. Você valida em poucas linhas antes de processar o evento, e o timestamp protege você contra alguém que reenvie uma entrega antiga.
- X-Cord-Event-Id para deduplicar sem ler o corpo
- X-Cord-Attempt informa o número da tentativa de entrega
- Durante uma rotação, assina com o segredo novo e com o anterior
import crypto from 'node:crypto';
// header = req.headers['x-cord-signature-v1'], rawBody = corpo bruto, sem parse
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 uma rotação chegam dois v1: basta que um confira
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);
});
}