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.
Headers del request
Sección titulada «Headers del request»OrderFast envía estos headers en cada entrega:
X-OrderFast-Event-Id: evt_01J...X-OrderFast-Event-Type: order.createdX-OrderFast-Timestamp: 1783420800X-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 |
Cómo se calcula la firma
Sección titulada «Cómo se calcula la firma»HMAC-SHA256(timestamp + "." + rawBody, webhook_secret)Donde:
timestampes el valor deX-OrderFast-TimestamprawBodyes el body del request sin parsear (bytes exactos)webhook_secretes el secret que recibiste al crear el webhook
El resultado se envía en X-OrderFast-Signature con el prefijo v1=.
Pasos para verificar
Sección titulada «Pasos para verificar»- Leé el body como string crudo, antes de parsearlo como JSON.
- Construí el string a firmar:
{timestamp}.{rawBody}. - Calculá
HMAC-SHA256usando tuwebhook_secret. - Compará el resultado con el valor después de
v1=enX-OrderFast-Signature. - Si no coincide, respondé
401y descartá el evento.
Ejemplo en Node.js
Sección titulada «Ejemplo en Node.js»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), );}Validar el timestamp
Sección titulada «Validar el timestamp»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.
Buenas prácticas
Sección titulada «Buenas prácticas»- 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.
