Ayuda a los usuarios a adoptar las llaves de acceso de forma más fluida

Fecha de publicación: 9 de mayo de 2025. Fecha de última actualización: 22 de diciembre 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 que ya tengan una contraseña guardada para tu sitio. La función Conditional Create, 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 basado en contraseña exitoso.

Si se cumplen ambas condiciones, puedes llamar a Conditional Create para solicitarle al administrador de contraseñas que cree una llave de acceso para el usuario. Después de crear la llave de acceso correctamente, se notifica al usuario según el administrador de contraseñas.

Flujo de solicitud de llave de acceso con creación condicional.

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.

Esta compatibilidad significa que funciona en sus respectivos proveedores de llaves de acceso predeterminados: el llavero de iCloud (Contraseñas) en Safari en macOS y iOS, y el Administrador de contraseñas de Google en Chrome en computadoras y Android.

Dado que iOS 18 o versiones posteriores y Android 14 o versiones posteriores admiten proveedores de llaves de acceso de terceros, independientemente del navegador que use el usuario, la compatibilidad con Conditional Create depende del proveedor de llaves de acceso. Si el proveedor de llaves de acceso seleccionado no admite Conditional Create, no se creará una llave de acceso nueva.

Cómo implementar Conditional Create

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 mediation parámetro establecido en "conditional", que funciona de manera similar al autocompletado de llaves de acceso para 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 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 la llave de acceso correctamente, 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 funciones

Puedes determinar si Conditional Create está disponible en el navegador invocando 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, Conditional Create tampoco lo está.

Cómo crear 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", como se muestra a continuación.

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

Conditional Create en sí 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.

Anula la llamada a 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 hacer que se cancele la llamada de obtención 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 correctamente

Cuando se realiza una creación condicional de llaves 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. Recuerda especificar excludeCredentials.
  • NotAllowedError: La creación de una llave de acceso no cumple con la condición.
  • AbortError: Se anula 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 y las fallas 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 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 accesos sin contraseña

En este punto, la creación condicional de una llave de acceso está protegida por el usuario que ingresa una contraseña válida. 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 la adopción de llaves de acceso en tu sitio web, lo que ayuda a los usuarios de tu sitio web a hacer una transición de contraseñas a un método de autenticación más seguro.

Para obtener más información sobre las llaves de acceso, comienza con Acceso sin contraseña con llaves de acceso.