Aller au contenu principal

Sécurité des webhooks

Chaque requête webhook de ConsentForge inclut une signature HMAC-SHA256. Vérifiez cette signature avant de traiter la charge utile pour vous assurer que la requête est authentique et n'a pas été falsifiée.

En-têtes de la requête

En-têteDescription
X-ConsentForge-SignatureRésumé hexadécimal HMAC-SHA256 de {timestamp}.{body}
X-ConsentForge-TimestampHorodatage Unix (secondes) lors de l'envoi de l'événement
X-ConsentForge-Delivery-IDID unique pour cette livraison (utilisez-le pour l'idempotence)

Algorithme de vérification

  1. Lisez X-ConsentForge-Timestamp depuis l'en-tête de la requête
  2. Lisez X-ConsentForge-Signature depuis l'en-tête de la requête
  3. Construisez la chaîne de signature : {timestamp}.{raw_request_body}
  4. Calculez le HMAC-SHA256 de la chaîne de signature en utilisant votre secret webhook
  5. Comparez (de manière sécurisée au niveau du timing) avec la signature reçue
  6. Rejetez si l'horodatage a plus de 5 minutes (protection contre les attaques par 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 retentées. Stockez les ID de livraison traités et ignorez les doublons.

Rotation du secret

Pour pivoter votre secret webhook :

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