Zum Hauptinhalt springen

Callbacks validieren

TL;DR – Eingehende HTTP-Callbacks von FIT-Connect über HMAC (SHA-512 über {timestamp}.{body}) und Zeitstempel prüfen, bevor Sie reagieren. Beide SDKs liefern dafür CallbackValidationUtil; der Callback selbst sagt nur, dass etwas anliegt — die Nachrichten holen Sie danach authentifiziert ab.

Warum validieren?​

Ohne HMAC-Prüfung könnte ein Angreifer beliebige HTTP-Requests an Ihren Callback-Endpunkt schicken und Ihre Anwendung in Geschäftsprozesse zwingen, die zu unautorisierten Datenzugriffen führen.

HMAC-Signatur prüfen​

Das Java-SDK bietet eine CallbackValidationUtil-Utility-Klasse:

import dev.fitko.fitconnect.sdk.util.CallbackValidationUtil;
import dev.fitko.fitconnect.core.validation.api.ValidationResult;

@PostMapping("/fit-connect/callback")
public ResponseEntity<Void> onCallback(
@RequestHeader("callback-authentication") String hmac,
@RequestHeader("callback-timestamp") Long timestamp,
@RequestBody String body) {

ValidationResult result = CallbackValidationUtil.validateCallback(
hmac, timestamp, body, callbackSecret);

if (result.isError()) {
LOGGER.warn("Ungültiger Callback: {}", result.message());
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}

handleCallback(body);
return ResponseEntity.ok().build();
}

Callback-Typen unterscheiden​

FIT-Connect sendet drei Arten von Callbacks. Den Typ erkennen Sie am Body bzw. am type-Feld (siehe Callback-Dokumentation):

TypWannEmpfänger
NewSubmissionsCallbackNeue Einreichung beim Zustellpunkt eingegangenVerwaltungssystem
NewRepliesCallbackNeue Antwort (Reply) für einen Case eingegangenOnlinedienst (Sender)
NewEventsCallbackNeues Event im Eventlog (z. B. accepted/rejected)Sender oder Subscriber
Häufige Stolperfallen
  • Body roh lesen: Der HMAC gilt über die Bytes, die FIT-Connect gesendet hat. Sobald ein Framework den JSON-Body deserialisiert und neu serialisiert, ändern sich die Bytes und die Prüfung schlägt fehl. Puffern Sie den Request-Body vor dem Model Binding (ASP.NET Core: request.EnableBuffering() oder wie oben direkt aus request.Body kopieren; Spring: @RequestBody String body).
  • Timestamp-Drift: Die Prüfung berücksichtigt den Zeitstempel. Wenn Ihre Serveruhr stark abweicht, schlägt die Validierung fehl. NTP einrichten.
  • Secret-Rotation: Wechseln Sie das Callback-Secret im Self-Service-Portal, müssen beide Versionen für eine Übergangszeit nebeneinander geprüft werden.

Weiterführende Themen​