RIVOX

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

Responda 2xx assim que persistir o evento e processe o resto de forma assíncrona. Respostas lentas ou de erro provocam retentativas.