WebAuthn (Web Authentication) es un estándar del W3C que habilita autenticación segura, sin contraseña y resistente al phishing usando criptografía de clave pública. Se utiliza ampliamente con passkeys para mejorar la seguridad y la experiencia de usuario. Sin embargo, autenticar usuarios con WebAuthn es solo el primer paso — tras una autenticación correcta, a menudo necesitas autorizar sus acciones en múltiples endpoints de API.
En este artículo, veremos cómo:
- Usar WebAuthn para autenticación basada en passkey.
- Recibir un bearer token desde tu servidor WebAuthn.
- Usar el bearer token devuelto para autorizar solicitudes HTTP posteriores.
1. Entender el flujo de autenticación WebAuthn
WebAuthn se basa en criptografÃa de clave pública y credenciales almacenadas de forma segura en el cliente (p. ej., passkeys en el navegador o el dispositivo). El flujo de autenticación generalmente implica estos pasos:
Paso 1: iniciar la autenticación- El cliente (navegador/app) solicita un challenge WebAuthn al servidor.
- El servidor genera un challenge y lo envÃa al cliente.
- El navegador usa la API WebAuthn (
navigator.credentials.get) para firmar el challenge con una clave privada almacenada en un passkey. - La aserción firmada se envÃa de vuelta al servidor.
- El servidor WebAuthn verifica la aserción usando la clave pública correspondiente.
- Si es válida, el servidor autentica al usuario.
En este punto has confirmado quién es el usuario, pero todavÃa necesitas una forma de autorizar el acceso a tus APIs.
2. Devolver un Bearer Token tras WebAuthn correcto
Si quieres que tras una autenticación correcta el servidor envÃe un bearer token que se usará para abrir una nueva conexión WebSocket o HTTP, pasa el parámetro token = true. Ejemplo:
{
"username": "alice@example.com", "token": true
}
Tras una autenticación correcta, el servidor enviará una respuesta como esta:
{
"verified": "ok",
"authentication": {
"token": "C760C1C39E3D4E829693A13F18F5CFDE537B516336FC48F7BAB0276176F9E6DE"
}
}
El evento OnWebAuthnUnauthorized se invoca cuando una solicitud no está autorizada y será desconectada; aquà puedes configurar qué endpoints requieren autenticación WebAuthn y cuáles no.
¿Por qué usar un Bearer Token?
- Elimina la necesidad de reautenticarse en cada solicitud.
- Permite autorización sin estado entre microservicios.
- Se integra de forma natural con los patrones modernos de seguridad de APIs.
3. Usar el Bearer Token para autorización de API
Una vez que tienes un nuevo token, basta con enviar una cabecera de autorización con este bearer token. Puedes usar la propiedad CustomHeaders de TsgcHTTP1Client para configurar el Bearer Token. Ejemplo:
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. Visión general del flujo extremo a extremo
Esta es la secuencia completa a alto nivel:

