Iniciar sesión

Verifica las firmas HMAC-SHA256 de los webhooks de SMS

Cómo confirmar que la petición viene de verdad de DroidSender y no de otra persona.

Última actualización

CabeceraQué contiene
X-DroidSender-Eventel nombre del evento, el mismo que en el cuerpo
X-DroidSender-Deliveryidentifica un intento de entrega; para eliminar duplicados, usa event más data.id (más data.status para sent, delivered y failed)
X-DroidSender-Signaturela firma, descrita más abajo
User-AgentDroidSender-Webhooks/2.0

Cada petición lleva la cabecera X-DroidSender-Signature con la forma t=<segundos unix>,v1=<hex>, donde v1 es el HMAC-SHA256 de "<t>.<cuerpo en bruto>" con el secreto de tu webhook.

const crypto = require("crypto");

function signatureIsValid(rawBody, header, secret) {
  const match = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header ?? "");
  if (!match) return false;

  const [, t, received] = match;

  // la marca de tiempo forma parte de lo que se firma: una entrega interceptada
  // no se puede reenviar mañana, y t no se puede reescribir sin el secreto
  const age = Math.abs(Math.floor(Date.now() / 1000) - Number(t));
  if (age > 300) return false;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${t}.${rawBody}`)
    .digest("hex");

  // comparación en tiempo constante: un === normal permite medir el secreto
  return crypto.timingSafeEqual(
    Buffer.from(expected, "hex"),
    Buffer.from(received, "hex"),
  );
}

Tus preferencias de cookies

Usamos cookies esenciales para que el sitio funcione. Con tu consentimiento, también usamos cookies de analítica y de publicidad para entender las visitas y medir nuestros anuncios. Puedes cambiar tu elección cuando quieras en la Configuración de cookies. Política de cookies