WebAuthn (Web Authentication) est un standard W3C qui permet une authentification sécurisée, sans mot de passe et résistante au phishing à l'aide de la cryptographie à clé publique. Il est largement utilisé avec les passkeys pour améliorer la sécurité et l'expérience utilisateur. Cependant, authentifier les utilisateurs avec WebAuthn n'est que la première étape — après une authentification réussie, tu as souvent besoin d'autoriser leurs actions sur plusieurs endpoints d'API.
Dans cet article, on va voir comment :
- Utiliser WebAuthn pour une authentification basée sur passkey.
- Recevoir un bearer token depuis ton serveur WebAuthn.
- Utiliser le bearer token retourné pour autoriser les requêtes HTTP suivantes.
1. Comprendre le flux d'authentification WebAuthn
WebAuthn s'articule autour de la cryptographie à clé publique et des identifiants stockés de manière sécurisée côté client (par ex. passkeys dans le navigateur ou l'appareil). Le flux d'authentification comporte généralement les étapes suivantes :
Étape 1 : initier l'authentification- Le client (navigateur/app) demande un challenge WebAuthn au serveur.
- Le serveur génère un challenge et l'envoie au client.
- Le navigateur utilise l'API WebAuthn (
navigator.credentials.get) pour signer le challenge à l'aide d'une clé privée stockée dans une passkey. - L'assertion signée est renvoyée au serveur.
- Le serveur WebAuthn vérifie l'assertion à l'aide de la clé publique correspondante.
- Si elle est valide, le serveur authentifie l'utilisateur.
À ce stade, tu as confirmé qui est l'utilisateur, mais tu as encore besoin d'un moyen d'autoriser l'accès à tes APIs.
2. Retourner un bearer token après une authentification WebAuthn réussie
Si tu veux qu'après une authentification réussie le serveur envoie un bearer token qui sera utilisé pour ouvrir une nouvelle connexion WebSocket ou HTTP, passe le paramètre token = true. Exemple :
{
"username": "alice@example.com", "token": true
}
Après une authentification réussie, le serveur enverra une réponse comme celle-ci :
{
"verified": "ok",
"authentication": {
"token": "C760C1C39E3D4E829693A13F18F5CFDE537B516336FC48F7BAB0276176F9E6DE"
}
}
L'événement OnWebAuthnUnauthorized est appelé quand une requête n'est pas autorisée et qu'elle va être déconnectée ; ici tu peux configurer quels endpoints requièrent une authentification WebAuthn et lesquels non.
Pourquoi utiliser un bearer token ?
- Il évite de devoir se réauthentifier à chaque requête.
- Il permet une autorisation sans état entre microservices.
- Il s'intègre parfaitement aux modèles modernes de sécurité d'API.
3. Utiliser le bearer token pour l'autorisation d'API
Une fois que tu as un nouveau jeton, il suffit d'envoyer un en-tête d'autorisation avec ce bearer token. Tu peux utiliser la propriété CustomHeaders du TsgcHTTP1Client pour configurer le bearer token. Exemple :
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. Aperçu du flux de bout en bout
Voici la séquence complète de haut niveau :

