Un análisis profundo de la mediación inmediata de WebAuthn. Descubre cómo crea un único botón de inicio de sesión, evita los confusos códigos QR y construye un flujo de inicio de sesión más inteligente.
Vincent
Created: August 8, 2025
Updated: August 13, 2025
See the original blog version in English here.
60-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
La transición a las passkeys está creando una "paradoja de las passkeys": algunos usuarios tienen passkeys, mientras que muchos otros todavía usan contraseñas tradicionales. Esto lleva a pantallas de inicio de sesión sobrecargadas con múltiples botones: "Iniciar sesión con contraseña", "Iniciar sesión con Google" e "Iniciar sesión con Passkey". Esta fragmentación causa fricción. Un usuario podría hacer clic en "Iniciar sesión con Passkey" en un nuevo dispositivo solo para encontrarse con un confuso aviso de código QR porque su passkey no está disponible localmente. El problema principal es la incapacidad del sitio web para conocer el contexto del usuario antes de iniciar un flujo de autenticación.
Una solución es optar por un enfoque de "primero el identificador" y determinar el mejor método de inicio de sesión para el usuario. Otra posible solución es un único botón inteligente de "Iniciar sesión" que organice el flujo más fluido para cada usuario. Debería solicitar directamente una passkey si hay una disponible en el dispositivo, o recurrir elegantemente a otros métodos si no la hay.
Se ha anunciado una nueva función de WebAuthn que podría hacer esto posible: la mediación
inmediata (mediation: 'immediate'
). Al establecer esta propiedad en una llamada a la API
de WebAuthn, los desarrolladores pueden construir una experiencia de inicio de sesión
inteligente y unificada que resuelve la paradoja de las passkeys. Este artículo ofrece un
análisis enfocado en desarrolladores sobre mediation: 'immediate'
, explorando qué es,
cómo funciona y cómo implementarla.
Recent Articles
📖
Capacidades de cliente de WebAuthn
📖
API Signal de WebAuthn: Actualizar y eliminar passkeys en el lado del cliente
🔑
Passkeys y la extensión PRF de WebAuthn para el cifrado de extremo a extremo (2025)
📖
Protocolo de Intercambio de Credenciales (CXP) y Formato (CXF) de WebAuthn
📖
WebAuthn pubKeyCredParams y credentialPublicKey: CBOR y COSE
Para entender la mediación inmediata, es útil conocer primero las otras opciones. La mediación del usuario en WebAuthn es la forma en que el navegador gestiona la interacción entre tu sitio web (el Relying Party) y el autenticador del usuario (p. ej., Face ID, YubiKey).
Este es el flujo clásico y explícito de WebAuthn. Cuando un
Relying Party llama a navigator.credentials.get()
sin
especificar una preferencia de mediation
, el navegador siempre presenta un
diálogo modal. Este diálogo se
superpone al contenido de la página, exigiendo la atención inmediata del usuario y
pausando cualquier otra interacción con el sitio web.
mediation: 'conditional'
#Introducido para ayudar a los usuarios en la
transición a las passkeys, este modo
es más sutil. Con mediation: 'conditional'
, la solicitud de WebAuthn se adjunta a un
campo de entrada (p. ej., nombre de usuario) con el atributo autocomplete="webauthn"
.
Cuando el usuario hace clic en el campo, la interfaz de autocompletar del navegador
sugiere cualquier passkey disponible.
mediation: 'immediate'
es la solución al problema del "botón único de inicio de sesión".
Proporciona una forma fiable para que un sitio web compruebe la disponibilidad de una
passkey antes de mostrar cualquier interfaz de usuario.
En lugar de decirle al usuario que se autentique con una passkey a través de un modal,
la mediación immediate
le pregunta al navegador: "¿Hay una passkey fácilmente
disponible para este usuario en este dispositivo ahora mismo?"
Crucialmente, esta consulta solo verifica las credenciales disponibles localmente (p. ej., autenticadores en el dispositivo como Windows Hello o passkeys sincronizadas a través de un gestor de contraseñas). Está diseñada para evitar activar el flujo de código QR entre dispositivos, que es un punto de fricción común.
El poder de esta función reside en su resultado claro y binario. La promesa devuelta por
navigator.credentials.get()
tendrá éxito o fallará, dando al desarrollador una señal
clara.
PublicKeyCredential
.navigator.credentials.get()
se rechaza inmediatamente con una
DOMException
llamada NotAllowedError
.El NotAllowedError
no es un error. Es más bien una característica. Es una señal fiable e
instantánea de que el sitio web debe proceder con un método de
autenticación de fallback. Esto permite a los
desarrolladores usar un simple bloque try...catch
: el bloque try
intenta el flujo
fluido de passkey, y el bloque catch
escucha el NotAllowedError
para renderizar un
formulario de inicio de sesión tradicional. Resuelve elegantemente el problema del botón
único de inicio de sesión creando un único punto de entrada que se adapta inteligentemente
al contexto del usuario.
Elegir el modo de mediación correcto es una decisión crítica de UX. Esta tabla ofrece una comparación lado a lado.
Característica / Comportamiento | Modal (por defecto) | UI condicional (conditional ) | Inmediata (immediate ) |
---|---|---|---|
Llamada a la API | navigator.credentials.get() | navigator.credentials.get({ mediation: 'conditional' }) | navigator.credentials.get({ mediation: 'immediate' }) |
Activador | Acción explícita del usuario (p. ej., clic en un botón) | Carga de la página; UI al enfocar el campo de entrada | Acción explícita del usuario (p. ej., clic en un botón) |
Presentación de la UI | Siempre muestra un diálogo modal inmediatamente. | Muestra una UI no modal, estilo autocompletar. | Solo si se encuentra una credencial local, muestra un diálogo modal. |
Comportamiento si no hay credencial local | Muestra una UI para flujos entre dispositivos (p. ej., código QR). | La promesa queda pendiente, nunca se resuelve, no se lanza ningún error. | La promesa se rechaza inmediatamente con NotAllowedError . |
Conocimiento del sitio | No aprende nada hasta que el usuario completa el flujo. | No aprende nada si el usuario no interactúa. Máxima privacidad. | Aprende un bit de información: si existe una credencial local. |
Caso de uso principal | Botón dedicado "Iniciar sesión con Passkey". 2FA explícito. | Formularios unificados de inicio de sesión/registro. Mejora progresiva de formularios de contraseña. | Un único botón principal de "Iniciar sesión" para una base de usuarios mixta. |
Acción del desarrollador | Gestionar el éxito o la cancelación del usuario. | Gestionar el éxito. No hay señal de fallo sobre la que actuar. | Gestionar el éxito o NotAllowedError para activar una UI de fallback. |
Aquí tienes una guía práctica, paso a paso, para implementar mediation: 'immediate'
.
Dado que mediation: 'immediate'
es una nueva característica, una detección de
características robusta es crucial.
// Feature detection is essential for progressive enhancement. let immediateMediationAvailable = false; if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) { try { const capabilities = await PublicKeyCredential.getClientCapabilities(); // The 'immediateGet' capability signals browser support. immediateMediationAvailable = capabilities.immediateGet === true; } catch (e) { console.error("Error getting client capabilities:", e); } }
navigator.credentials.get()
#Esta llamada debe ser activada por un gesto del usuario, como el clic en un botón.
// This function should be the event handler for your primary "Sign In" button. async function handleSignInClick() { if (!immediateMediationAvailable) { // Fall back to showing a legacy login form if the feature isn't supported. showLegacyLoginForm(); return; } try { // Fetch a fresh, random challenge from your server for each attempt. const challenge = await fetchChallengeFromServer(); const publicKeyCredentialRequestOptions = { challenge: challenge, // The server-provided challenge as a Uint8Array rpId: "example.com", // The allowCredentials list MUST be empty for immediate mediation // to protect user privacy. allowCredentials: [], }; const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, // This is the key that enables the immediate mediation flow. mediation: "immediate", }); // If the promise resolves, send the credential to your server for verification. await verifyCredentialOnServer(credential); } catch (error) { // The catch block is a critical part of the control flow. handleAuthError(error); } }
NotAllowedError
para un fallback elegante#El bloque catch
es donde se materializa la "inteligencia" del botón único de inicio de
sesión.
// Handling the NotAllowedError is the key to the fallback mechanism. function handleAuthError(error) { // Check the 'name' property of the DOMException. if (error.name === "NotAllowedError") { // This is the expected signal to show the traditional login form. console.log("No local passkey found. Showing legacy login form."); showLegacyLoginForm(); } else { // This handles other potential errors, like the user dismissing the prompt. console.error("Authentication error:", error); } }
Para la experiencia más fluida, puedes pedirle al navegador que busque tanto passkeys como
contraseñas guardadas en la misma solicitud añadiendo password: true
.
// Combining passkeys and passwords for a truly unified sign-in experience. const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, password: true, // Ask the browser to include saved passwords. mediation: "immediate", }); // The returned 'credential' object will either be a PublicKeyCredential // or a PasswordCredential. Your server-side logic must handle both.
conditional
pendiente (a menudo
iniciada en la carga de la página) puede bloquear una nueva solicitud immediate
.
Considera usar un AbortController
para cancelar cualquier solicitud pendiente antes
de iniciar una nueva.allowCredentials
: El array allowCredentials
debe estar
vacío. Proporcionar IDs de credenciales hará que la llamada falle. Esta es una
salvaguarda de privacidad crucial para evitar que los sitios comprueben la presencia de
usuarios específicos y conocidos.mediation: 'immediate'
fue diseñada con una clara comprensión de sus contrapartidas de
seguridad y privacidad.
La contrapartida principal es una "fuga de un bit". Al medir el tiempo de resolución de la promesa, un Relying Party puede inferir un bit de información: si la promesa se rechazó instantáneamente (no hay credencial local) o se retrasó (se mostró un aviso en la UI porque se encontró una credencial local). El propósito de esta fuga es permitir una mejor UX.
Los diseñadores anticiparon el potencial de abuso (p. ej., seguimiento de usuarios) e integraron varias salvaguardas no negociables:
allowCredentials
prohibida: El array allowCredentials
debe estar vacío.
Esto evita que un sitio use esta función para comprobar si un usuario conocido
específico está de visita.iframe
de otro origen) para evitar el seguimiento entre
sitios.Estas mitigaciones aseguran que las garantías de seguridad fundamentales de WebAuthn permanezcan intactas. La ceremonia de autenticación en sí no cambia y sigue siendo resistente al phishing.
mediation: 'immediate'
es una característica avanzada de la
especificación WebAuthn Nivel 3, y su despliegue está
en curso. A mediados de 2025, una estrategia de mejora progresiva es esencial.
Navegador | Estado | Notas y fuente |
---|---|---|
Chrome | Prueba para desarrolladores | Disponible a través de la bandera experimental-web-platform-features . Seguimiento del error. |
Edge | En desarrollo (esperado) | Al ser un navegador basado en Chromium, el soporte debería seguir al de Chrome. |
Safari (WebKit) | En consideración | Posiciones de estándares de WebKit. Sin compromiso público. |
Firefox (Gecko) | En consideración | Posiciones de estándares de Mozilla. Sin compromiso público. |
Mientras que mediation: 'immediate'
proporciona una gran herramienta de bajo nivel para
un botón de inicio de sesión más inteligente, es importante distinguirla de una solución
más amplia de
"Passkey Intelligence",
como la que ofrece Corbado. Ambas buscan resolver la paradoja de las passkeys y aumentar
la adopción, pero lo hacen de diferentes maneras.
Característica | mediation: 'immediate' | Passkey Intelligence (p. ej., Corbado) |
---|---|---|
Cómo funciona | Una llamada a la API nativa del navegador que comprueba si hay passkeys disponibles localmente en el dispositivo actual. | Un servicio de backend que recopila y analiza datos sobre los dispositivos de los usuarios, autenticadores e historial de inicio de sesión entre sesiones. |
Señal proporcionada | Una señal simple y binaria: existe una passkey local (aviso en la UI ) o no (NotAllowedError ). | Información contextual enriquecida, p. ej., "Este usuario acaba de iniciar sesión con contraseña en un dispositivo compatible con passkeys que usa a menudo". |
Ventaja clave | Comprobación nativa muy rápida con una sobrecarga de red mínima. | Disponibilidad universal, independiente del soporte del navegador/SO para nuevas funciones de WebAuthn. Información más profunda para una UX más personalizada. |
Dependencia principal | Requiere soporte actualizado del navegador y del SO, que aún no es universal. | Integración con un servicio de backend. |
Passkey Intelligence va un paso más allá al recopilar y evaluar datos a lo largo del tiempo. Esto permite intervenciones de usuario más sofisticadas y oportunas. Por ejemplo, un backend de Passkey Intelligence puede detectar:
Este enfoque basado en datos es independiente del soporte del navegador para
mediation: 'immediate'
, lo que significa que puede proporcionar un flujo de inicio de
sesión más inteligente para todos tus usuarios, ahora mismo.
Lo mejor de ambos mundos
En última instancia, estos dos enfoques no son mutuamente excluyentes; son complementarios. La solución ideal los combina:
mediation: 'immediate'
como una de sus señales en los
navegadores compatibles para realizar una comprobación inicial rápida.Al combinar la velocidad nativa de mediation: 'immediate'
con la información profunda de
un backend de
Passkey Intelligence,
puedes proporcionar la experiencia de inicio de sesión más fluida, adaptativa y efectiva
posible, guiando suavemente a cada usuario hacia un futuro sin contraseñas.
La mediación inmediata es una gran mejora para la experiencia de inicio de sesión. Proporciona la inteligencia necesaria para eliminar puntos comunes de fricción y confusión para los usuarios durante la transición a las passkeys.
immediate
elimina la carga cognitiva para el usuario. Ya no tienen que
recordar qué método de autenticación configuraron o elegir de una lista sobrecargada de
opciones. El proceso de inicio de sesión se vuelve más simple e intuitivo.mediation: 'immediate'
solo busca credenciales locales, evita este estado confuso por
completo. En lugar de que el usuario abandone el flujo, la aplicación recibe una señal
clara (NotAllowedError
) para recurrir elegantemente a otro método, lo que resulta en
un recorrido más fluido.La mediación inmediata es una nueva función de WebAuthn que resuelve la experiencia de inicio de sesión fragmentada del período de transición a las passkeys. Permite la creación de un único botón inteligente de "Iniciar sesión" que se adapta al contexto del usuario, eliminando la confusión y la fricción. Aunque introduce una contrapartida de privacidad calculada, incluye salvaguardas robustas para mitigar los riesgos sin comprometer la seguridad fundamental de WebAuthn.
Para los desarrolladores, el camino a seguir es la mejora progresiva. Construir una
experiencia base sólida y añadir la mediación immediate
por encima para los navegadores
compatibles. Adoptar esta característica es un movimiento estratégico para acelerar la
adopción de passkeys, mejorar la seguridad,
reducir los costos operativos y mejorar la conversión.
Implementar estos flujos de autenticación avanzados puede ser complejo. La plataforma de
Passkey Empresarial de Corbado abstrae esta complejidad. Nuestra
infraestructura se encarga de la orquestación
óptima del flujo —incluyendo la mediación condicional e immediate
— permitiendo a tu
equipo desplegar una experiencia de autenticación de vanguardia y sin fricciones con
confianza.
Enjoyed this read?
🤝 Join our Passkeys Community
Share passkeys implementation tips and get support to free the world from passwords.
🚀 Subscribe to Substack
Get the latest news, strategies, and insights about passkeys sent straight to your inbox.
Related Articles
Table of Contents