Obtener opciones para autenticación WebAuthn
Endpoint público para iniciar el flujo de login con WebAuthn/FIDO2 obteniendo las publicKey options necesarias para navigator.credentials.get(). No requiere JWT.
🔓 Endpoint público (sin JWT)
Este endpoint está diseñado para usarse durante el proceso de login. Genera un challenge y devuelve las opciones necesarias para autenticar al usuario con una credencial WebAuthn previamente registrada.
/auth/authentication/optionsObtiene opciones de autenticación WebAuthn para login (sin JWT)
📋 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
Este endpoint se usa como Paso 1 del login con WebAuthn:
- Enviar
emailpara obtener opciones (publicKey) - Ejecutar
navigator.credentials.get({ publicKey: options })en frontend - Enviar la respuesta al endpoint de verificación:
/auth/webauthn/authentication/verify
Request Body
{
"email": "usuario@ejemplo.com"
}
Tipos de Respuesta
Respuesta Exitosa
Opciones generadas (200)
El servidor devuelve las opciones necesarias para iniciar la autenticación en el navegador.
{
"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 registradas.
{
"message": "No WebAuthn credentials found for user"
}
Campos de Respuesta
Configuración de autenticación
- challenge: desafío criptográfico único para la sesión
- timeout: límite para completar la operación (ms) — típico 60000
- rpId: identificador del relying party (dominio/aplicación)
- userVerification: nivel de verificación requerido (ej.
preferred)
allowCredentials
Lista de credenciales permitidas para el usuario:
- id: ID de la credencial en base64
- type: siempre
"public-key" - transports: métodos soportados (
usb,nfc,internal,ble)
Ejemplo de Implementación (Frontend)
// 1) Obtener opciones del servidor (SIN token de autorización)
const response = await fetch('/auth/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
Diferencias con /auth/webauthn/authentication/options
Este endpoint (/auth/authentication/options) es distinto del endpoint autenticado /auth/webauthn/authentication/options:
| Característica | /auth/authentication/options | /auth/webauthn/authentication/options |
|---|---|---|
| Autenticación JWT | ❌ No requerida | ✅ Requerida |
| Uso principal | Login inicial | Gestión de credenciales |
| Contexto | Usuario aún no autenticado | Usuario ya autenticado |
Notas
Notas de implementación
- No requiere autenticación JWT (es parte del proceso de login)
- Las opciones expiran típicamente en 60 segundos
- Si el usuario no tiene credenciales WebAuthn, retorna 404
- Diseñado específicamente para el flujo de login con WebAuthn
Consideraciones de Seguridad
Protecciones recomendadas
- Endpoint público pero limitado por email del usuario
- Aplicar rate limiting para prevenir enumeración de usuarios
- No exponer metadata sensible de las credenciales
- Challenge único por solicitud para prevenir ataques de replay
Endpoints Relacionados
/auth/webauthn/authentication/verify- Verificar autenticación/auth/webauthn/authentication/options- Versión autenticada (gestión)/auth/webauthn/registration/options- Registrar nueva credencial/auth/login- Login tradicional (alternativo)
Consejos de Implementación
Detección de soporte
if (window.PublicKeyCredential) {
// WebAuthn es soportado
// Mostrar opción de login con WebAuthn
} 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 configuración o políticas del navegador