Zum Hauptinhalt springen

Webhook-Sicherheit

Jede Webhook-Anfrage von ConsentForge enthält eine HMAC-SHA256-Signatur. Verifizieren Sie diese Signatur, bevor Sie das Payload verarbeiten, um sicherzustellen, dass die Anfrage authentisch ist und nicht manipuliert wurde.

Anfrage-Header

HeaderBeschreibung
X-ConsentForge-SignatureHMAC-SHA256 Hex-Digest von {timestamp}.{body}
X-ConsentForge-TimestampUnix-Zeitstempel (Sekunden) zum Zeitpunkt des Event-Versands
X-ConsentForge-Delivery-IDEindeutige ID für diese Zustellung (für Idempotenz verwenden)

Verifizierungsalgorithmus

  1. X-ConsentForge-Timestamp aus dem Anfrage-Header lesen
  2. X-ConsentForge-Signature aus dem Anfrage-Header lesen
  3. Signing-String erstellen: {timestamp}.{raw_request_body}
  4. HMAC-SHA256 des Signing-Strings mit Ihrem Webhook-Secret berechnen
  5. Timing-sicher mit der empfangenen Signatur vergleichen
  6. Anfrage ablehnen, wenn der Zeitstempel älter als 5 Minuten ist (Replay-Schutz)

Code-Beispiele

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

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

return hash_equals($expected, $signature);
}

// Usage in a Laravel controller:
$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();

Idempotenz

Verwenden Sie X-ConsentForge-Delivery-ID, um wiederholte Zustellungen zu deduplizieren. Speichern Sie verarbeitete Zustellungs-IDs und überspringen Sie Duplikate.

Secret-Rotation

So rotieren Sie Ihr Webhook-Secret:

  1. Generieren Sie ein neues Secret im Dashboard (altes Secret noch 24 Stunden gültig)
  2. Aktualisieren Sie Ihren Server auf das neue Secret
  3. Nach 24 Stunden wird das alte Secret ungültig