Verificar y guardar credencial WebAuthn
Endpoint: POST /auth/webauthn/registration/verify
Verifica y guarda una nueva credencial WebAuthn/FIDO2 generada por el cliente usando las opciones obtenidas previamente.
🔐 Requiere autenticación JWT
Debes enviar un token JWT válido en el header:
Authorization: Bearer <accessToken>
📝 Cuerpo de la solicitud
{
"credential": {
"id": "credential-id",
"rawId": "raw-credential-id",
"response": {
"attestationObject": "attestation-object-base64",
"clientDataJSON": "client-data-json-base64"
},
"type": "public-key"
},
"name": "YubiKey de Juan"
}
Parámetros:
- credential: Objeto credencial completo generado por
navigator.credentials.create() - name (opcional): Nombre personalizado para identificar esta credencial
📋 Respuestas
✅ 200 OK
-
Credencial verificada y guardada
{
"verified": true,
"credentialId": "credential-uuid",
"name": "YubiKey de Juan",
"createdAt": "2025-01-20T14:45:00.000Z"
}
❌ 400 Bad Request
-
Credencial inválida
{
"verified": false,
"error": "Invalid credential format"
} -
Challenge expirado o inválido
{
"verified": false,
"error": "Invalid or expired challenge"
} -
Credencial ya registrada
{
"verified": false,
"error": "Credential already registered"
}
❌ 401 Unauthorized
-
Sin token válido
{
"statusCode": 401,
"message": "Unauthorized"
}
🔍 Proceso de verificación
Validaciones realizadas
- Challenge: Verifica que el challenge coincida con el generado previamente
- Origen: Confirma que la credencial fue creada para el dominio correcto
- Formato: Valida la estructura del objeto credencial
- Unicidad: Verifica que la credencial no esté ya registrada
- Attestation: Procesa la attestation si está presente
Datos almacenados
- ID de credencial: Identificador único de la credencial
- Clave pública: Para futuras verificaciones de autenticación
- Contador: Para detectar credenciales clonadas
- Metadatos: Información del autenticador y usuario
- Nombre personalizado: Si se proporcionó
💻 Ejemplo de implementación frontend
// Después de obtener options de /auth/webauthn/registration/options
const credential = await navigator.credentials.create({
publicKey: options
});
// Verificar credencial
const verifyResponse = await fetch('/auth/webauthn/registration/verify', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
credential: credential,
name: 'Mi YubiKey' // Opcional
})
});
const result = await verifyResponse.json();
if (result.verified) {
console.log('Credencial registrada exitosamente');
}
📱 Tipos de credenciales soportadas
Llaves de seguridad
- YubiKey: Todas las versiones FIDO2
- Google Titan: Llaves de seguridad de Google
- Feitian: Llaves de seguridad compatibles
- Otras: Cualquier llave certificada FIDO2
Autenticación biométrica
- TouchID: En dispositivos Apple compatibles
- Windows Hello: Huella dactilar y reconocimiento facial
- Android: Autenticación biométrica nativa
- Otros: Autenticadores integrados compatibles
📝 Notas
- La credencial debe crearse usando las opciones de
/auth/webauthn/registration/options - El campo
namees opcional pero recomendado para identificar credenciales múltiples - Una vez registrada, la credencial puede usarse para autenticación
- Las credenciales registradas aparecerán en
/auth/webauthn/credentials(endpoint documentation)
🔗 Endpoints relacionados
/auth/webauthn/registration/options- Obtener opciones de registro/auth/webauthn/credentials(endpoint documentation) - Listar credenciales registradas/auth/webauthn/credential/:id- Eliminar credencial específica
⚡ Consejos de implementación
- Maneja errores de usuario (cancelación, timeout)
- Proporciona feedback visual durante el proceso
- Permite nombres descriptivos para múltiples credenciales
- Verifica soporte WebAuthn antes de mostrar la opción
Requisito previo: Debes haber obtenido opciones válidas de
/auth/webauthn/registration/optionsantes de intentar verificar una credencial.