Verificar webhooks
Verificar a assinatura HMAC Rivox-Signature e proteger o endpoint contra replay.
Cada entrega inclui o cabeçalho Rivox-Signature. Verifique-o sempre antes de processar o corpo do pedido, usando o corpo bruto e uma comparação em tempo constante.
Cabeçalho
Rivox-Signature: t=1788350460,v1=9f2b...t— instante da assinatura, em segundos.v1— HMAC-SHA256 de`${t}.${corpo}`com o segredo do endpoint.- Rejeite entregas com um t fora da sua tolerância (por exemplo, cinco minutos) para impedir replay.
Exemplo
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyRivoxSignature(rawBody, header, secret, toleranceSeconds = 300) {
const parts = Object.fromEntries(
header.split(",").map((piece) => piece.split("=").map((value) => value.trim())),
);
const timestamp = Number(parts.t);
if (!Number.isFinite(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - timestamp) > toleranceSeconds) return false;
const expected = createHmac("sha256", secret)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
const received = Buffer.from(parts.v1 ?? "", "utf8");
const computed = Buffer.from(expected, "utf8");
return received.length === computed.length && timingSafeEqual(received, computed);
}Responda depressa
Responda2xx assim que persistir o evento e processe o resto de forma assíncrona. Respostas lentas ou de erro provocam retentativas.