Aller au contenu principal

Sécurité des webhooks

Chaque requête webhook de ConsentForge contient une signature HMAC-SHA256. Vérifiez cette signature avant de traiter le payload pour vous assurer que la requête est authentique et n'a pas été altérée.

En-têtes de requête

En-têteDescription
X-ConsentForge-SignatureDigest hex HMAC-SHA256 de {timestamp}.{body}
X-ConsentForge-TimestampHorodatage Unix (secondes) de l'envoi de l'événement
X-ConsentForge-Delivery-IDID unique pour cette livraison (utiliser pour l'idempotence)

Algorithme de vérification

  1. Lire X-ConsentForge-Timestamp depuis l'en-tête de requête
  2. Lire X-ConsentForge-Signature depuis l'en-tête de requête
  3. Construire la chaîne de signature : {timestamp}.{raw_request_body}
  4. Calculer HMAC-SHA256 de la chaîne de signature avec votre secret webhook
  5. Comparer (de manière sécurisée par rapport aux attaques temporelles) avec la signature reçue
  6. Rejeter si l'horodatage a plus de 5 minutes (protection contre le rejeu)

Exemples de code

function verifyConsentForgeWebhook(
string $rawBody,
string $signature,
string $timestamp,
string $secret
): bool {
// Rejeter si trop ancien (5 minutes)
if (abs(time() - (int)$timestamp) > 300) {
return false;
}

$signingString = $timestamp . '.' . $rawBody;
$expected = hash_hmac('sha256', $signingString, $secret);

return hash_equals($expected, $signature);
}

// Utilisation dans un contrôleur Laravel :
$rawBody = $request->getContent();
$signature = $request->header('X-ConsentForge-Signature');
$timestamp = $request->header('X-ConsentForge-Timestamp');
$secret = config('services.consentforge.webhook_secret');

if (!verifyConsentForgeWebhook($rawBody, $signature, $timestamp, $secret)) {
return response('Unauthorized', 401);
}

$payload = $request->json()->all();

Idempotence

Utilisez X-ConsentForge-Delivery-ID pour dédupliquer les livraisons répétées. Stockez les IDs de livraison traités et ignorez les doublons.

Rotation du secret

Pour faire pivoter votre secret webhook :

  1. Générez un nouveau secret dans le tableau de bord (l'ancien secret reste actif pendant 24 heures)
  2. Mettez à jour votre serveur avec le nouveau secret
  3. Après 24 heures, l'ancien secret sera invalidé