Se connecter

Vérifier les signatures HMAC-SHA256 des webhooks SMS

Comment vérifier que la requête vient bien de DroidSender et non de quelqu’un d’autre.

Dernière mise à jour

En-têteContenu
X-DroidSender-Eventle nom de l’événement, le même que dans le corps
X-DroidSender-Deliveryidentifie une tentative de livraison ; pour dédoublonner, utilisez event plus data.id (plus data.status pour sent, delivered et failed)
X-DroidSender-Signaturela signature, décrite ci-dessous
User-AgentDroidSender-Webhooks/2.0

Chaque requête porte l’en-tête X-DroidSender-Signature sous la forme t=<secondes unix>,v1=<hex>, où v1 est le HMAC-SHA256 de "<t>.<corps brut>" calculé avec le secret de votre 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;

  // l'horodatage fait partie de ce qui est signé : une livraison interceptée
  // ne peut pas être rejouée demain, et t ne peut pas être réécrit sans le secret
  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");

  // comparaison à temps constant : un simple === permet de mesurer le secret
  return crypto.timingSafeEqual(
    Buffer.from(expected, "hex"),
    Buffer.from(received, "hex"),
  );
}

Vos préférences en matière de cookies

Nous utilisons des cookies essentiels au fonctionnement du site. Avec votre accord, nous utilisons aussi des cookies de mesure d’audience et de publicité pour comprendre les visites et mesurer nos annonces. Vous pouvez modifier votre choix à tout moment dans les Paramètres des cookies. Politique relative aux cookies