Autorización mediante PassKeys

· Características

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:

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 Paso 2: aserción de credencial en el cliente Paso 3: verificación en el servidor

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?

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: