Autorizzazione tramite PassKey

· Funzionalità

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:

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 Passo 2: asserzione di credenziali lato client Passo 3: verifica lato server

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?

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: