Obtener opciones para registro WebAuthn
Genera las opciones necesarias para iniciar el registro de una nueva credencial WebAuthn/FIDO2 (llave de seguridad o autenticación biométrica) usando navigator.credentials.create().
🔐 Requiere autenticación JWT
Debes enviar un token JWT válido en el header:
Authorization: Bearer <accessToken>
🧾 Registro de una nueva credencial
Este endpoint genera el challenge y los parámetros publicKey para registrar un autenticador (FIDO2/WebAuthn). Luego, el frontend crea la credencial y la envía a verificación.
POST
/auth/webauthn/registration/optionsObtiene opciones de registro WebAuthn para el usuario autenticado
📤 Respuesta
{
"rp": {
"name": "SwapBits",
"id": "localhost"
},
"user": {
"id": "user-id-base64",
"name": "usuario@ejemplo.com",
"displayName": "usuario@ejemplo.com"
},
"challenge": "base64-challenge-string",
"pubKeyCredParams": [
{ "type": "public-key", "alg": -7 },
{ "type": "public-key", "alg": -257 }
],
"timeout": 60000,
"attestation": "none",
"authenticatorSelection": {
"userVerification": "preferred",
"requireResidentKey": false
}
}Contexto de Uso
Flujo de registro WebAuthn:
- Obtener opciones (este endpoint)
- Crear credencial con
navigator.credentials.create({ publicKey: options }) - Verificar y guardar enviando la respuesta a
/auth/webauthn/registration/verify
Tipos de Respuesta
Respuesta Exitosa
Opciones de registro generadas (200)
{
"rp": {
"name": "SwapBits",
"id": "localhost"
},
"user": {
"id": "user-id-base64",
"name": "usuario@ejemplo.com",
"displayName": "usuario@ejemplo.com"
},
"challenge": "base64-challenge-string",
"pubKeyCredParams": [
{ "type": "public-key", "alg": -7 },
{ "type": "public-key", "alg": -257 }
],
"timeout": 60000,
"attestation": "none",
"authenticatorSelection": {
"userVerification": "preferred",
"requireResidentKey": false
}
}
Errores
No autorizado (401)
Token ausente o inválido.
{
"statusCode": 401,
"message": "Unauthorized"
}
Campos de Respuesta
Relying Party (rp)
- name: nombre de la aplicación mostrado por el autenticador
- id: identificador del dominio/aplicación (RP ID)
Usuario (user)
- id: identificador del usuario codificado en base64
- name: email o username
- displayName: nombre visible en el autenticador
Configuración de credencial
- challenge: desafío criptográfico único para esta sesión
- pubKeyCredParams: algoritmos de clave pública soportados (ES256, RS256, etc.)
- timeout: límite de tiempo (ms), típico 60000
- attestation: usualmente
"none"para mayor compatibilidad
Selección de autenticador
- userVerification: preferencia de verificación del usuario (ej.
preferred) - requireResidentKey: si requiere credenciales residentes (
falsepara compatibilidad)
Ejemplo de Implementación (Frontend)
// 1) Obtener opciones del servidor
const response = await fetch('/auth/webauthn/registration/options', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
const options = await response.json();
// 2) Crear credencial WebAuthn
const credential = await navigator.credentials.create({
publicKey: options
});
// 3) Enviar al servidor para verificación
// (ver webauthn-registration-verify.md)
Características de Seguridad
Controles de seguridad
- Challenge único: previene ataques de replay
- Timeout limitado: típicamente 60 segundos
- Algoritmos seguros: soporte para ES256 (-7) y RS256 (-257)
- Configuración flexible: maximiza compatibilidad entre dispositivos
Notas
Notas
- Las opciones generadas son válidas típicamente por 60 segundos
- Compatible con llaves FIDO2/WebAuthn (YubiKey, etc.)
- Soporta autenticación biométrica (TouchID, Windows Hello, etc.)
- No requiere credenciales WebAuthn previas: sirve para registrar una nueva
Endpoints Relacionados
/auth/webauthn/registration/verify- Verificar y guardar credencial/auth/webauthn/authentication/options- Opciones para autenticación/auth/webauthn/credentials- Listar credenciales existentes (ver documentación)