Publicado el 9 de mayo de 2025
Las llaves de acceso ofrecen una autenticación sólida y resistente al phishing. Sin embargo, lograr que los usuarios las adopten puede generar fricción. Con la creación automática de llaves de acceso, puedes crear llaves de acceso para tus usuarios en el momento adecuado, siempre y cuando ya tengan una contraseña guardada para tu sitio. La creación condicional, que permite la creación automática de llaves de acceso, forma parte de la especificación de WebAuthn.
Cómo funciona
Para ayudar a los usuarios a adoptar las llaves de acceso de manera más conveniente, usa una función de la API de WebAuthn llamada Conditional Create. Conditional Create permite que tu sitio solicite una llave de acceso para el usuario sin que este deba realizar ninguna acción.
Este flujo funciona cuando se cumplen las siguientes condiciones:
- El usuario tiene una contraseña guardada en su administrador de contraseñas predeterminado.
- La contraseña se usó recientemente. Lo ideal es llamar a Conditional Create inmediatamente después de un acceso exitoso basado en contraseña.
Si se cumplen ambas condiciones, puedes solicitar al administrador de contraseñas que cree una llave de acceso para el usuario llamando a Conditional Create. Después de crear correctamente la llave de acceso, el usuario recibe una notificación según el administrador de contraseñas.
Compatibilidad
Conditional Create es compatible con Safari en macOS y todos los navegadores en iOS, así como con Chrome en computadoras y Chrome en Android.
Implementa la función de creación condicional
La creación automática de llaves de acceso se basa en una función de la API de WebAuthn llamada Conditional Create. Estas son solicitudes create()
de WebAuthn normales con el parámetro mediation
establecido en "conditional"
, que funciona de manera similar al autocompletado de llaves de acceso para las solicitudes get()
.
Usa Conditional Create después de que el usuario acceda con una contraseña. El éxito de la creación depende del administrador de contraseñas y de que se cumplan ciertas condiciones. Estas condiciones pueden variar según el administrador de contraseñas y cambiar con el tiempo. Por ejemplo, en Chrome con el Administrador de contraseñas de Google (GPM), el usuario debe haber accedido recientemente con una contraseña guardada para el sitio.
Si el navegador crea correctamente la llave de acceso, devuelve una credencial de clave pública. Envía esta credencial a tu backend para completar el registro y habilitar la autenticación futura.
Detección de características
Puedes determinar si Conditional Create está disponible en el navegador invocando PublicKeyCredential.getClientCapabilities()
. Comprueba si un objeto devuelto contiene true
para la propiedad conditionalCreate
.
if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) {
const capabilities = await PublicKeyCredential.getClientCapabilities();
if (capabilities.conditionalCreate) {
// Conditional create is available
}
}
Si getClientCapabilities
no está disponible, Conditional Create tampoco lo estará.
Crea una llave de acceso de forma condicional
Para realizar una creación automática de llaves de acceso, invoca navigator.credentials.create()
, pero con mediation: "conditional"
de la siguiente manera.
const cred = await navigator.credentials.create({
publicKey: options,
// Request conditional creation
mediation: 'conditional'
});
Debes usar la creación automática de llaves de acceso inmediatamente después de que el usuario acceda para tener más posibilidades de cumplir con los criterios del administrador de contraseñas para la creación automática.
Puedes enviar la credencial de clave pública resultante al servidor para verificar y registrar la llave de acceso. En el servidor, asegúrate de que el usuario haya accedido.
Advertencias
La creación condicional por sí sola no es difícil de implementar, pero hay varias advertencias cuando se integra esta función en un sistema existente.
Ignorar la presencia y la verificación del usuario en el servidor
La respuesta de registro devuelve "User Presence" y "User Verified" como false
, por lo que el servidor debe ignorar estos parámetros durante la verificación de credenciales.
Anula la llamada de WebAuthn en curso antes de realizar una creación automática de llaves de acceso
Cuando el RP espera que el usuario acceda con una llave de acceso o una contraseña, realizar una solicitud GET condicional es la mejor opción. Esto puede provocar que se cancele la llamada get condicional antes de realizar una creación condicional.
Para ello, debes usar AbortController
y llamar a .abort()
.
// To abort a WebAuthn call, instantiate an AbortController.
const controller = new AbortController();
const cred = await navigator.credentials.get({
publicKey: options,
signal: controller.signal,
// Request conditional get
mediation: 'conditional'
});
// Abort the call
controller.abort();
Ignora las excepciones con facilidad
Cuando se realiza una creación condicional de una llave de acceso, hay algunos casos en los que debes ignorar las excepciones:
InvalidStateError
: Ya existe una llave de acceso en el proveedor de llaves de acceso (no olvides especificarexcludeCredentials
).NotAllowedError
: Crear una llave de acceso no cumple con la condición.AbortError
: Se aborta la llamada a WebAuthn.
Mostrar errores en estos casos puede confundir al usuario, ya que el navegador los controla de forma silenciosa: solo muestra una notificación cuando se realiza la acción correctamente y los errores no activan mensajes visibles.
Indica cuándo falla el registro de una llave de acceso
Cuando se crea una llave de acceso, pero no se registra en el servidor, el usuario experimentará un intento de acceso fallido. Esto puede ocurrir cuando la lista de claves de acceso no coincide entre el proveedor de claves de acceso y el servidor.
Para evitar estas situaciones, usa la API de Signals para mantener la coherencia.
No se admite la actualización desde el acceso sin contraseña
En este punto, la creación condicional de una llave de acceso está controlada por la entrada de una contraseña válida por parte del usuario. Esto significa que los enfoques de acceso sin contraseña, como los vínculos mágicos, la verificación del número de teléfono o la federación de identidades, no cumplirán con la condición.
Resumen
La creación automática de llaves de acceso puede acelerar su adopción en tu sitio web, lo que ayudará a los usuarios de tu sitio web a hacer la transición de las contraseñas a un método de autenticación más seguro.
Para obtener más información sobre las llaves de acceso, consulta Acceso sin contraseña con llaves de acceso.