WebAuthn (Web Authentication) ist ein W3C-Standard, der sichere, passwortlose und phishing-resistente Authentifizierung mit Public-Key-Kryptografie ermöglicht. Er wird häufig mit Passkeys eingesetzt, um Sicherheit und Nutzererlebnis zu verbessern. Die Authentifizierung von Nutzern mit WebAuthn ist jedoch nur der erste Schritt — nach erfolgreicher Authentifizierung musst du ihre Aktionen oft über mehrere API-Endpunkte hinweg autorisieren.
In diesem Artikel behandeln wir, wie du:
- WebAuthn für Passkey-basierte Authentifizierung nutzt.
- einen Bearer-Token von deinem WebAuthn-Server empfängst.
- den zurückgegebenen Bearer-Token verwendest, um nachfolgende HTTP-Anfragen zu autorisieren.
1. Den WebAuthn-Authentifizierungs-Flow verstehen
WebAuthn basiert auf Public-Key-Kryptografie und Credentials, die sicher auf dem Client (z.B. Passkeys im Browser oder Gerät) gespeichert sind. Der Authentifizierungs-Flow umfasst im Allgemeinen folgende Schritte:
Schritt 1: Authentifizierung starten- Der Client (Browser/App) fordert eine WebAuthn-Challenge vom Server an.
- Der Server generiert eine Challenge und sendet sie an den Client.
- Der Browser verwendet die WebAuthn-API (
navigator.credentials.get), um die Challenge mit einem privaten Schlüssel aus einem Passkey zu signieren. - Die signierte Assertion wird an den Server zurückgesendet.
- Der WebAuthn-Server verifiziert die Assertion mit dem entsprechenden öffentlichen Schlüssel.
- Bei gültiger Assertion authentifiziert der Server den Nutzer.
An diesem Punkt hast du bestätigt, wer der Nutzer ist, aber du brauchst noch einen Weg, um den Zugriff auf deine APIs zu autorisieren.
2. Bearer-Token nach erfolgreichem WebAuthn zurückgeben
Wenn du möchtest, dass der Server nach erfolgreicher Authentifizierung einen Bearer-Token sendet, der zum Öffnen einer neuen WebSocket- oder HTTP-Verbindung verwendet wird, übergib den Parameter token = true. Beispiel:
{
"username": "alice@example.com", "token": true
}
Nach erfolgreicher Authentifizierung sendet der Server eine Antwort wie diese:
{
"verified": "ok",
"authentication": {
"token": "C760C1C39E3D4E829693A13F18F5CFDE537B516336FC48F7BAB0276176F9E6DE"
}
}
Das Ereignis OnWebAuthnUnauthorized wird ausgelöst, wenn eine Anfrage nicht autorisiert ist und getrennt wird. Hier kannst du konfigurieren, welche Endpunkte eine WebAuthn-Authentifizierung erfordern und welche nicht.
Warum einen Bearer-Token verwenden?
- Er macht eine erneute Authentifizierung bei jeder Anfrage überflüssig.
- Er ermöglicht zustandslose Autorisierung über Microservices hinweg.
- Er lässt sich nahtlos in moderne API-Sicherheitsmuster integrieren.
3. Bearer-Token für API-Autorisierung verwenden
Sobald du ein neues Token hast, sendest du einfach einen Authorization-Header mit diesem Bearer-Token. Du kannst die Eigenschaft CustomHeaders des TsgcHTTP1Client verwenden, um den Bearer-Token zu konfigurieren. Beispiel:
procedure GetHTTPRequest(const aURL: string; const aToken: string): string;
var
oHTTP: TsgcHTTP1Client;
begin
oHTTP := TsgcHTTP1Client.Create(nil);
Try
oHTTP.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + aToken);
result := oHTTP.Get(aURL);
Finally
oHTTP.Free;
End;
end;
4. End-to-End-Flow im Überblick
Hier ist die komplette High-Level-Sequenz:

