Fecha de publicación: 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 los adopten puede generar fricciones. Con la creación automática de llaves de acceso, puedes crearlas para tus usuarios en el momento adecuado, siempre y cuando ya tengan una contraseña guardada para tu sitio. La creación condicional, que habilita 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 forma más conveniente, usa una función de la API de WebAuthn llamada Creación condicional. La creación condicional 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 la creación condicional inmediatamente después de un acceso correcto con contraseña.
Si se cumplen ambas condiciones, puedes solicitarle 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, se le notifica al usuario según el administrador de contraseñas.
Compatibilidad
La creación condicional es compatible con Safari en macOS y iOS, así como con Chrome en computadoras.
Cómo implementar la creación condicional
La creación automática de llaves de acceso se basa en una función de la API de WebAuthn llamada
Creación condicional. Estas son solicitudes create()
normales de WebAuthn con el parámetro mediation
establecido en "conditional"
, que funciona de manera similar al autocompletado de llaves de acceso para las solicitudes get()
.
Usa la creación condicional después de que el usuario acceda con una contraseña. El hecho de que la creación se realice correctamente 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 pueden 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, muestra 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 atributos
Para determinar si la creación condicional está disponible en el navegador, invoca PublicKeyCredential.getClientCapabilities()
. Comprueba si un objeto que se muestra 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, la creación condicional 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 la mejor oportunidad 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 no es difícil de implementar, pero hay varias advertencias cuando se integra esta función en un sistema existente.
Ignora la presencia y la verificación del usuario en el servidor
La respuesta de registro muestra "Presencia del usuario" y "Usuario verificado" como false
, por lo que el servidor debe ignorar estas marcas durante la verificación de credenciales.
Aborta 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, la mejor opción es realizar una obtención condicional. Esto puede provocar que se cancele la llamada de 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 de llave de acceso condicional, 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 cancela la llamada a WebAuthn.
Mostrar errores en estos casos puede confundir al usuario, ya que el navegador los controla de forma silenciosa: muestra una notificación solo cuando se realiza correctamente la acción, y los errores no activan mensajes visibles.
Señal cuando 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 llaves de acceso es incoherente entre el proveedor de llaves de acceso y el servidor.
Para evitar estas circunstancias, usa la API de Signal para mantener la coherencia.
No se admite la actualización desde los accesos sin contraseña
En este punto, la creación de una llave de acceso de forma condicional está restringida a que el usuario introduzca una contraseña válida. Esto significa que los enfoques de acceso sin contraseña, como los vínculos mágicos, la verificación de números de teléfono o la integración de identidades, no cumplirán con la condición.
Resumen
La creación automática de llaves de acceso puede acelerar la adopción de llaves de acceso en tu sitio web, lo que ayuda a los usuarios a realizar 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.