Ir al contenido

Firma HMAC

Cada evento webhook incluye una firma criptográfica. Tu servidor debe validarla antes de procesar el evento — esto garantiza que el request viene de OrderFast y que el body no fue alterado en tránsito.

OrderFast envía estos headers en cada entrega:

X-OrderFast-Event-Id: evt_01J...
X-OrderFast-Event-Type: order.created
X-OrderFast-Timestamp: 1783420800
X-OrderFast-Signature: v1=4b7f...
Content-Type: application/json
Header Descripción
X-OrderFast-Event-Id ID único del evento — usalo para idempotencia
X-OrderFast-Event-Type Tipo de evento (ej. order.created)
X-OrderFast-Timestamp Timestamp Unix (segundos) del momento de envío
X-OrderFast-Signature Firma HMAC del body
HMAC-SHA256(timestamp + "." + rawBody, webhook_secret)

Donde:

  • timestamp es el valor de X-OrderFast-Timestamp
  • rawBody es el body del request sin parsear (bytes exactos)
  • webhook_secret es el secret que recibiste al crear el webhook

El resultado se envía en X-OrderFast-Signature con el prefijo v1=.

  1. Leé el body como string crudo, antes de parsearlo como JSON.
  2. Construí el string a firmar: {timestamp}.{rawBody}.
  3. Calculá HMAC-SHA256 usando tu webhook_secret.
  4. Compará el resultado con el valor después de v1= en X-OrderFast-Signature.
  5. Si no coincide, respondé 401 y descartá el evento.
import crypto from 'node:crypto';
function verifyWebhook(rawBody, headers, secret) {
const timestamp = headers['x-orderfast-timestamp'];
const signature = headers['x-orderfast-signature'];
const expected = crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
const received = signature.replace('v1=', '');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(received),
);
}

Además de la firma, verificá que X-OrderFast-Timestamp no sea demasiado antiguo. Esto protege contra replay attacks.

Recomendación: rechazá eventos con más de 5 minutos de antigüedad respecto al reloj de tu servidor.

  • Guardá el secret de forma segura — nunca lo expongas en código cliente ni en logs.
  • Validá antes de procesar — rechazá requests sin firma válida.
  • Usá HTTPS en tu endpoint — los webhooks viajan por internet en texto plano si no usás TLS.
  • Registrá el X-OrderFast-Event-Id — te ayuda a detectar duplicados y a debuggear con el historial de entregas.