Saltar al contenido
verificaOTP

Capítulo 3 de 4 · 14 min de lectura

Enrutamiento y capacidades

Recibe eventos entrantes por webhook y verifica su firma HMAC antes de confiar en ellos.

Cuando un usuario responde a tu DID, o cuando el operador confirma la entrega, tu sistema recibe un webhook. Ese endpoint es público por definición, así que cualquiera puede llamarlo. La firma HMAC es lo que te permite distinguir un evento legítimo de uno falsificado.

Firmar y verificar

El emisor calcula HMAC-SHA256(secret, body) y lo envía en un header. Tú recalculas con el mismo secreto sobre el cuerpo crudo, exactamente como llegó, y comparas en tiempo constante. mx.webhook.sign usa WebCrypto real: el hex que ves es un HMAC auténtico.

Verificar antes de parsear, no después
app.post("/webhooks/votp", express.json(), (req, res) => {
// req.body is already parsed JSON: re-serializing it
// almost never matches the bytes that were actually signed.
const body = JSON.stringify(req.body);
if (!verify(body, req.headers["x-votp-signature"])) {
return res.status(401).end();
}
res.status(200).end();
});
Mostrando: antes · haz click para alternar

Capacidades por número

No todo número sirve para todo. Antes de enrutar, consulta las capacidades del DID (SMS entrante, SMS saliente, voz) y el país de destino. Un error común es intentar SMS desde un fijo habilitado solo para voz: el envío falla en silencio.

Reintentos e idempotencia

La mayoría de los proveedores reintentan la entrega de un webhook si tu endpoint no responde 200 a tiempo, lo que significa que puedes recibir el mismo evento dos o tres veces. Si procesas la confirmación de entrega sin controlar duplicados, puedes marcar como entregado un mensaje y luego revertirlo por error, o duplicar efectos secundarios como notificaciones al usuario.

La solución habitual es tratar el id del evento como clave de idempotencia: antes de procesar, revisa si ya existe un registro con ese id, y si existe, responde 200 sin reprocesar nada. Es una guarda barata comparada con el costo de depurar efectos duplicados en producción.

Se marca completado al leer el 80%.

Comentarios (3)

Se guardan solo en tu navegador.

  • Pablo Gutiérrez10 oct

    Lo del cuerpo crudo nos costó un día entero de debugging con un framework que parseaba antes del middleware.

  • Isidora Lillo11 oct

    Agregaría incluir un timestamp en lo firmado para evitar replays del webhook.

    • Equipo verificaOTP11 oct

      Totalmente. Firmar timestamp más cuerpo y rechazar eventos con más de 5 minutos es la práctica recomendada.