Obtener opciones para autenticación WebAuthn
Obtiene las opciones necesarias para iniciar el proceso de autenticación con una credencial WebAuthn/FIDO2 previamente registrada usando navigator.credentials.get().
🔑 Inicio de autenticación WebAuthn
Este endpoint genera un challenge y devuelve las opciones publicKey requeridas para que el frontend solicite autenticación mediante WebAuthn/FIDO2.
POST
/auth/webauthn/authentication/optionsObtiene opciones de autenticación WebAuthn para credenciales previamente registradas
📋 Parámetros
emailstringrequeridoCorreo electrónico del usuario que desea autenticarse
📤 Respuesta
{
"challenge": "base64-challenge-string",
"timeout": 60000,
"rpId": "localhost",
"allowCredentials": [
{
"id": "credential-id-base64",
"type": "public-key",
"transports": ["usb", "nfc"]
},
{
"id": "another-credential-id-base64",
"type": "public-key",
"transports": ["internal"]
}
],
"userVerification": "preferred"
}Contexto de Uso
Flujo típico:
- Obtener opciones: llamar a este endpoint con el email del usuario
- Solicitar autenticación: usar las opciones en
navigator.credentials.get() - Verificar autenticación: enviar la respuesta a
/auth/webauthn/authentication/verify
Request Body
{
"email": "usuario@ejemplo.com"
}
Tipos de Respuesta
Respuesta Exitosa
Opciones generadas (200)
Opciones listas para consumir en el frontend con navigator.credentials.get():
{
"challenge": "base64-challenge-string",
"timeout": 60000,
"rpId": "localhost",
"allowCredentials": [
{
"id": "credential-id-base64",
"type": "public-key",
"transports": ["usb", "nfc"]
},
{
"id": "another-credential-id-base64",
"type": "public-key",
"transports": ["internal"]
}
],
"userVerification": "preferred"
}
Errores
Email requerido (400)
No se proporcionó el email.
{
"message": "Email is required"
}
Usuario no encontrado o sin credenciales (404)
El usuario no existe o no tiene credenciales WebAuthn asociadas.
{
"message": "No WebAuthn credentials found for user"
}
Campos de Respuesta
Configuración de autenticación
- challenge: desafío criptográfico único por sesión
- timeout: límite para completar la autenticación (ms) — típico 60000
- rpId: identificador del relying party (dominio/aplicación)
- userVerification: nivel requerido de verificación del usuario
allowCredentials
Lista de credenciales permitidas:
- id: identificador de credencial en base64
- type: siempre
"public-key" - transports: medios soportados por la credencial (
usb,nfc,internal,ble)
Ejemplo de Implementación (Frontend)
// 1) Obtener opciones del servidor
const response = await fetch('/auth/webauthn/authentication/options', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: 'usuario@ejemplo.com' })
});
const options = await response.json();
// 2) Solicitar autenticación WebAuthn
const credential = await navigator.credentials.get({
publicKey: options
});
// 3) Enviar al servidor para verificación
// (ver webauthn-authentication-verify.md)
Tipos de Transporte
Transports soportados
- usb: llaves físicas USB (YubiKey, etc.)
- nfc: llaves NFC (autenticación por proximidad)
- internal: autenticadores integrados (TouchID, Windows Hello, biometría)
- ble: llaves Bluetooth / móviles como autenticadores
Notas
Notas
- No requiere autenticación JWT (parte del proceso de login, según el flujo actual)
- Solo muestra credenciales del usuario especificado
- Las opciones expiran típicamente en 60 segundos
- Si el usuario no tiene credenciales WebAuthn, retorna 404
Endpoints Relacionados
/auth/webauthn/authentication/verify- Verificar autenticación/auth/webauthn/registration/options- Registrar nueva credencial/auth/webauthn/credentials- Gestionar credenciales existentes (ver documentación)
Consejos de Implementación
Detección de soporte
if (window.PublicKeyCredential) {
// WebAuthn es soportado
} else {
// Fallback a otros métodos de autenticación
}
Manejo de errores (cliente)
- Timeout: el usuario tardó demasiado en responder
- NotAllowedError: el usuario canceló la operación
- SecurityError: error de seguridad o configuración