WebAuthn (Web Authentication) è uno standard W3C che abilita un'autenticazione sicura, senza password e resistente al phishing usando la crittografia a chiave pubblica. Viene ampiamente usato con le passkey per migliorare sicurezza ed esperienza utente. Tuttavia, autenticare gli utenti con WebAuthn è solo il primo passo: dopo l'autenticazione riuscita, spesso devi autorizzare le loro azioni su più endpoint API.
In questo articolo vedremo come:
- Usare WebAuthn per l'autenticazione basata su passkey.
- Ricevere un bearer token dal tuo server WebAuthn.
- Usare il bearer token restituito per autorizzare le successive richieste HTTP.
1. Comprendere il flusso di autenticazione WebAuthn
WebAuthn ruota attorno alla crittografia a chiave pubblica e alle credenziali memorizzate in modo sicuro sul client (ad esempio passkey nel browser o sul dispositivo). Il flusso di autenticazione prevede generalmente questi passaggi:
Passo 1: avvio dell'autenticazione- Il client (browser/app) richiede al server una challenge WebAuthn.
- Il server genera una challenge e la invia al client.
- Il browser usa l'API WebAuthn (
navigator.credentials.get) per firmare la challenge usando una chiave privata memorizzata in una passkey. - L'asserzione firmata viene rispedita al server.
- Il server WebAuthn verifica l'asserzione usando la corrispondente chiave pubblica.
- Se valida, il server autentica l'utente.
A questo punto hai confermato chi è l'utente, ma serve ancora un modo per autorizzare l'accesso alle tue API.
2. Restituire un bearer token dopo il successo di WebAuthn
Se vuoi che dopo un'autenticazione riuscita il server invii un bearer token da usare per aprire una nuova connessione WebSocket o HTTP, passa il parametro token = true. Esempio:
{
"username": "alice@example.com", "token": true
}
Dopo un'autenticazione riuscita, il server invierà una risposta simile a questa:
{
"verified": "ok",
"authentication": {
"token": "C760C1C39E3D4E829693A13F18F5CFDE537B516336FC48F7BAB0276176F9E6DE"
}
}
L'evento OnWebAuthnUnauthorized viene chiamato quando una richiesta non è autorizzata e verrà disconnessa; qui puoi configurare quali endpoint richiedono l'autenticazione WebAuthn e quali no.
Perché usare un bearer token?
- Elimina la necessità di riautenticarsi a ogni richiesta.
- Permette un'autorizzazione stateless tra microservizi.
- Si integra perfettamente con i pattern moderni di sicurezza API.
3. Usare il bearer token per autorizzare le API
Una volta ottenuto un nuovo token, basta inviare un header di autorizzazione con questo bearer token. Puoi usare la proprietà CustomHeaders del TsgcHTTP1Client per configurare il bearer token. Esempio:
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. Panoramica del flusso end-to-end
Ecco la sequenza completa ad alto livello:

