Skip to main content

Obtener opciones para autenticación WebAuthn

Endpoint: POST /auth/webauthn/authentication/options


Obtiene las opciones necesarias para iniciar el proceso de autenticación con una credencial WebAuthn/FIDO2 previamente registrada.


📝 Cuerpo de la solicitud

{
"email": "usuario@ejemplo.com"
}
  • email: Correo electrónico del usuario que desea autenticarse

📋 Respuestas

✅ 200 OK

  • Opciones de autenticación generadas

    {
    "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"
    }

❌ 400 Bad Request

  • Email no proporcionado

    {
    "message": "Email is required"
    }

❌ 404 Not Found

  • Usuario no encontrado o sin credenciales

    {
    "message": "No WebAuthn credentials found for user"
    }

📊 Campos de respuesta

Configuración de autenticación

  • challenge: Desafío criptográfico único para esta sesión de autenticación
  • timeout: Tiempo límite en milisegundos para completar la autenticación (60 segundos)
  • rpId: Identificador del dominio/aplicación
  • userVerification: Nivel de verificación de usuario requerido

Credenciales permitidas (allowCredentials)

  • id: ID de la credencial codificado en base64
  • type: Tipo de credencial (siempre "public-key")
  • transports: Métodos de transporte soportados por la credencial

🔄 Flujo de autenticación WebAuthn

  1. Obtener opciones: Llamar a este endpoint con el email del usuario
  2. Solicitar autenticación: Usar las opciones con navigator.credentials.get() en el frontend
  3. Verificar autenticación: Enviar la respuesta a /auth/webauthn/authentication/verify

💻 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

USB

  • Llaves de seguridad conectadas por USB
  • YubiKey y similares

NFC

  • Llaves de seguridad con comunicación NFC
  • Autenticación tocando el dispositivo

Internal

  • Autenticadores integrados en el dispositivo
  • TouchID, Windows Hello, autenticación biométrica

Bluetooth

  • Llaves de seguridad Bluetooth
  • Dispositivos móviles como autenticadores

📝 Notas

  • No requiere autenticación JWT (es parte del proceso de login)
  • Solo muestra credenciales del usuario especificado
  • Las opciones expiran en 60 segundos
  • Si el usuario no tiene credenciales WebAuthn, retorna error 404

🔗 Endpoints relacionados


⚡ 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

  • Timeout: Usuario tardó demasiado en responder
  • NotAllowed: Usuario canceló la operación
  • Security: Error de seguridad o configuración

Siguiente paso: Usar las opciones recibidas para solicitar autenticación WebAuthn en el frontend y luego verificarla con /auth/webauthn/authentication/verify.