Explora cómo funcionan los transportes de WebAuthn en las API de los navegadores, AuthenticationServices de iOS y Credential Manager de Android para la autenticación con passkeys entre dispositivos.

Vincent
Created: October 31, 2025
Updated: October 31, 2025

See the original blog version in English here.
Passkeys for Super Funds and Financial Institutions
Join our Webinar on 7th November to learn how Super Funds and Financial Institutions can implement passkeys
| Plataforma | Autenticadores de plataforma | Llaves de seguridad |
|---|---|---|
| Navegadores web | Windows Hello: ["internal"]Google Password Manager: ["internal", "hybrid"]iCloud Keychain: ["internal", "hybrid"] | ["usb", "nfc"] |
| Android Nativo | ["internal", "hybrid"] | ["usb", "nfc"] |
| iOS Nativo | ⚠️ Vacío [] (iCloud Keychain) | ["usb", "nfc"] |
Nota: Según la especificación de WebAuthn, un array de transportes vacío significa que todos los transportes son compatibles.
Al implementar passkeys en distintas plataformas, nos enfrentamos como desarrolladores a una decisión importante:
La respuesta está en entender los transportes de WebAuthn, un detalle técnico que determina cómo los autenticadores se comunican con las relying parties. Aunque los transportes parecen sencillos en teoría, su implementación varía significativamente entre los navegadores web, las aplicaciones nativas de iOS y las de Android, sobre todo en lo que respecta al manejo de los transportes internos e híbridos.
Este artículo examina cómo funcionan los transportes de WebAuthn en diferentes plataformas y presenta dos enfoques distintos para gestionar los transportes internos e híbridos, cada uno con sus propias ventajas y desventajas.
Recent Articles
📖
Orígenes Relacionados de WebAuthn: Guía para Passkeys entre Dominios
🔑
Las licencias de conducir móviles ya están aquí: la guía definitiva sobre las mDL
⚙️
Transportes de WebAuthn: Transporte interno e híbrido
🔑
Cómo eliminar las contraseñas por completo
♟️
Biometría y conocimiento del pagador en el enlace dinámico
Este artículo cubre:
Los transportes de WebAuthn definen los métodos de comunicación entre los autenticadores y los dispositivos cliente. La especificación de WebAuthn Nivel 3 define seis tipos de transporte:
usb: Utilizado por llaves de seguridad de hardware que se conectan a través de puertos USB, como las YubiKeys u otros tokens de seguridad FIDO2.
nfc: Permite la comunicación con autenticadores a través de Near Field Communication, lo que permite a los usuarios tocar sus llaves de seguridad o dispositivos con NFC.
ble: Facilita la autenticación a través de Bluetooth de baja energía, permitiendo la comunicación inalámbrica con autenticadores externos.
smart-card: Utilizado para lectores de tarjetas inteligentes, permitiendo la autenticación a través de estas.
hybrid: Permite la autenticación entre dispositivos, típicamente donde un usuario escanea un código QR para autenticarse entre dispositivos, como usar un teléfono para autenticarse en un navegador de escritorio, o viceversa. Este transporte puede activar la solicitud de código QR tanto en dispositivos de escritorio como móviles, lo que no siempre es deseable según el contexto. Nota: hybrid se añadió en WebAuthn Nivel 3.
internal: El autenticador está integrado en el propio dispositivo, como iCloud Keychain (verificado mediante Face ID o Touch ID) en iPhones, Windows Hello en PC o Google Password Manager en dispositivos Android. Estos son los autenticadores de plataforma.
Cuando se crea un passkey, el autenticador indica qué transportes admite. Esta información se envía a la relying party (tu backend), que debería guardarla junto con la credencial. Durante la autenticación, la relying party envía estos transportes de vuelta al cliente en la lista allowCredentials, ayudando al navegador o a la plataforma a determinar qué métodos de autenticación ofrecer al usuario.
El manejo de los transportes difiere significativamente entre plataformas, lo que crea los desafíos de compatibilidad a los que se enfrentan los desarrolladores.
Los navegadores reciben la información de transporte de los autenticadores y la respetan durante los flujos de autenticación. Cuando creas un passkey en Chrome, Safari o Edge, el gestor de credenciales del navegador proporciona datos de transporte que varían según el autenticador subyacente:
Autenticadores de plataforma: Windows Hello proporciona solo ["internal"], reflejando su naturaleza vinculada al dispositivo. Sin embargo, cuando Chrome utiliza Google Password Manager como autenticador, proporciona ["internal", "hybrid"] porque Google Password Manager admite la autenticación entre dispositivos a través de teléfonos Android.
Llaves de seguridad de hardware: Proporcionan transportes específicos como ["usb", "nfc"] según sus capacidades reales.
Gestores de credenciales sincronizados en la nube: iCloud Keychain en Safari y Google Password Manager en Chrome suelen proporcionar ["internal", "hybrid"] para admitir flujos de autenticación tanto locales como entre dispositivos.
Esta información fluye de manera fiable en contextos web, aunque los transportes específicos dependen del autenticador que el navegador seleccione para almacenar las credenciales.
Documentación: Especificación de WebAuthn del W3C
La API Credential Manager de Android se comporta de manera similar a los navegadores web. Al crear passkeys en aplicaciones nativas de Android, el Credential Manager proporciona información de transporte que refleja el comportamiento web: los autenticadores de plataforma informan de sus capacidades con precisión y el sistema maneja los datos de transporte de forma consistente. Los desarrolladores de Android pueden confiar en esta información sin necesidad de un manejo especial.
Documentación: Android Credential Manager
iOS presenta una situación más compleja. El framework AuthenticationServices de Apple maneja los transportes de manera diferente según el tipo de autenticador:
Autenticadores de plataforma (iCloud Keychain, verificado mediante Face ID o Touch ID): A menudo devuelven arrays de transportes vacíos durante la creación de passkeys. Esto no significa que el passkey carezca de capacidades de transporte, simplemente que iOS no las informa explícitamente. Según el estándar WebAuthn, omitir los transportes significa que cualquier transporte es aceptable, por lo que la autenticación híbrida seguirá funcionando.
Llaves de seguridad: Sí proporcionan información de transporte (p. ej., ["usb"], ["nfc"]) cuando se usan con dispositivos iOS, siguiendo el patrón esperado.
Documentación: AuthenticationServices de Apple
Como desarrolladores, nos enfrentamos a una elección: seguir la especificación estrictamente u optimizar los transportes internos e híbridos para la experiencia del usuario. Cada enfoque tiene sus ventajas y desventajas.
Este enfoque se alinea con la especificación de WebAuthn: usar los transportes exactamente como los proporciona el autenticador durante el registro de la credencial y enviarlos de vuelta sin cambios durante la autenticación.
Implementación: Cuando se crea un passkey, guarda el array transports de la respuesta del autenticador. Durante la autenticación, incluye estos transportes exactos en la lista allowCredentials:
{ "allowCredentials": [ { "id": "credential-id-base64", "type": "public-key", "transports": ["internal", "hybrid"] } ] }
Ventajas:
Desventajas:
Ideal para: Aplicaciones que priorizan la conformidad con los estándares, entornos empresariales con diversos tipos de autenticadores.
Este enfoque prioriza la experiencia del usuario modificando selectivamente los transportes internos e híbridos en función de objetivos de optimización específicos. En lugar de una regla general, consideremos estos escenarios de optimización comunes:
Problema: Los autenticadores de plataforma de iOS devuelven arrays de transportes vacíos. Si se dejan vacíos o se rellenan desde el backend, los usuarios podrían ver solicitudes de llaves de seguridad (USB, NFC) junto a las opciones de plataforma, creando confusión en las aplicaciones de consumo.
Solución: Establecer explícitamente los transportes a ["hybrid", "internal"] para los autenticadores de plataforma de iOS. Esto asegura que solo se ofrezcan la autenticación de plataforma y los flujos entre dispositivos, ocultando las opciones de llaves de seguridad.
// Al guardar las credenciales del autenticador de plataforma de iOS if (platform === "iOS" && authenticatorAttachment === "platform") { transports = ["hybrid", "internal"]; }
Resultado: Una interfaz de autenticación limpia sin solicitudes de llaves de seguridad para los passkeys creados en iOS.
Problema: Al autenticarse en dispositivos móviles, mostrar códigos QR para la autenticación entre dispositivos crea una mala experiencia de usuario, ya que los usuarios ya están en un dispositivo móvil con sus passkeys disponibles.
Solución: Eliminar el transporte hybrid cuando el usuario se está autenticando desde un dispositivo móvil, dejando solo ["internal"].
// Al construir allowCredentials para la autenticación const transports = isMobileDevice ? credentials.transports.filter((t) => t !== "hybrid") : credentials.transports;
Resultado: Los usuarios móviles ven solo opciones de autenticación directa sin solicitudes innecesarias de código QR.
⚠️ Precaución: La manipulación de transportes no siempre produce resultados consistentes en todas las plataformas. Pruebas exhaustivas demuestran que las combinaciones de navegador y sistema operativo manejan los transportes de manera diferente:
hybrid se excluye de los transportes.hybrid está incluido.Riesgo de callejones sin salida: Un filtrado de transportes demasiado restrictivo puede crear callejones sin salida en la autenticación, donde los usuarios no pueden iniciar sesión en absoluto. Por ejemplo, eliminar hybrid podría impedir escenarios legítimos de autenticación entre dispositivos en los que un usuario necesita autenticarse desde un dispositivo prestado. Proporciona siempre métodos de autenticación alternativos y realiza pruebas exhaustivas en tus plataformas de destino antes de implementar optimizaciones de transporte.
Estas son sugerencias de optimización: WebAuthn proporciona otros mecanismos para optimizar la experiencia de usuario de la autenticación más allá de la manipulación de transportes, como las sugerencias (hints).
El comportamiento de los transportes es impredecible: La autenticación entre dispositivos (CDA) a través del transporte hybrid muestra un comportamiento inconsistente en las distintas combinaciones de navegador y sistema operativo. Las pruebas en el mundo real demuestran que los valores de transporte no garantizan un comportamiento específico de la interfaz de usuario; las plataformas interpretan y manejan los transportes de manera diferente, lo que lleva a resultados inesperados.
Complejidad específica de la plataforma: Al controlar explícitamente los transportes, debes tener en cuenta las diferencias entre plataformas:
["internal"]; añadir hybrid activa códigos QR no deseados.hybrid en el array de transportes.Se requiere una comprensión completa: Controlar explícitamente los transportes significa asumir la responsabilidad de todo el flujo. Debes entender cómo se comporta cada combinación de transporte en todas tus plataformas de destino y realizar pruebas exhaustivas. La manipulación de transportes puede crear callejones sin salida en la autenticación donde no existe una ruta de autenticación válida para los usuarios.
Ventajas:
Desventajas:
Ideal para: Aplicaciones de consumo con requisitos de experiencia de usuario específicos, equipos con recursos para mantener la lógica específica de cada plataforma, escenarios que priorizan flujos de autenticación simplificados sobre el estricto cumplimiento de la especificación.
El manejo de los transportes de WebAuthn no existe de forma aislada; es una pieza de tu estrategia general de implementación de passkeys. Surgen dos enfoques comunes en las implementaciones en producción, cada uno con diferentes implicaciones para el uso de transportes internos e híbridos.
Este enfoque prioriza la flexibilidad y el cumplimiento de los estándares, permitiendo a los usuarios autenticarse con cualquier autenticador compatible.
Características de la implementación:
[], permitiendo que cualquier credencial coincida.usb, nfc, ble).Implicaciones para los transportes:
Con un allowCredentials vacío, los transportes se vuelven menos críticos durante la autenticación: la plataforma muestra todas las opciones disponibles. Sin embargo, esto significa que los usuarios pueden ver simultáneamente solicitudes de llaves de seguridad, códigos QR y opciones de plataforma, lo que puede crear una parálisis por decisión en las aplicaciones de consumo.
Ideal para: Entornos empresariales, aplicaciones con bases de usuarios diversas que requieren soporte para llaves de seguridad, escenarios que priorizan la máxima flexibilidad de autenticación.
Este enfoque optimiza la experiencia de usuario para el consumidor restringiendo la creación de passkeys a los autenticadores de plataforma y utilizando flujos de "primero el identificador".
Características de la implementación:
authenticatorAttachment: "platform".preferImmediatelyAvailableCredentials, que excluye por definición las llaves de seguridad y la autenticación entre dispositivos.preferImmediatelyAvailableCredentials en aplicaciones nativas, pero este escenario es raro (los usuarios suelen tener los passkeys en el dispositivo que están usando).internal e hybrid.Implicaciones para los transportes:
Dado que allowCredentials contiene credenciales específicas con sus transportes, el manejo de estos se vuelve crucial.
Ideal para: Aplicaciones de consumo, aplicaciones móviles nativas, escenarios que priorizan una experiencia de usuario simplificada sobre la flexibilidad del autenticador, plataformas donde ya existen flujos de "primero el identificador".
| Característica | Conformidad con el estándar | Adaptado al consumidor |
|---|---|---|
| allowCredentials | Array vacío | Credenciales específicas del usuario |
| Tipos de autenticador | Todos (plataforma, llaves de seguridad, CDA) | Plataforma + CDA |
| API de app nativa | WebAuthn estándar | Puede usar preferImmediatelyAvailableCredentials |
| Llaves de seguridad | Soportadas | Generalmente excluidas |
| Relevancia del transporte | Baja (lista de permitidos vacía) | Alta (credenciales específicas) |
| Códigos QR móviles | Pueden aparecer | Se pueden optimizar para eliminarlos |
| Experiencia de usuario | Más opciones, más complejidad | Simplificada, menos decisiones |
| Complejidad de implementación | Menor | Mayor |
| Fricción para el consumidor | Mayor (múltiples opciones de autenticación) | Menor (optimizado para flujos de consumo) |
Para plataformas que ya revelan la existencia de una cuenta o utilizan flujos de "primero el identificador" (el usuario introduce el correo electrónico antes de ver las opciones de inicio de sesión), el enfoque adaptado al consumidor se alinea de forma natural. Una vez que el usuario ha proporcionado su identificador:
allowCredentials con credenciales específicas y sus transportes.En estos escenarios, los transportes pueden convertirse en una herramienta de optimización en lugar de una preocupación de seguridad. Puedes adaptar las opciones de autenticación según el contexto del dispositivo (móvil vs. escritorio) y las capacidades de las credenciales.
Recomendación: Para plataformas que ya utilizan flujos de "primero el identificador" o donde la enumeración de cuentas no es una preocupación, el enfoque adaptado al consumidor con un manejo explícito de los transportes proporciona una experiencia de usuario superior, especialmente en aplicaciones móviles nativas donde preferImmediatelyAvailableCredentials permite una autenticación biométrica fluida.
Independientemente del enfoque que elijas para gestionar los transportes internos e híbridos, sigue estas prácticas para minimizar problemas:
Guarda los transportes durante el registro: Almacena siempre el array transports de la respuesta del autenticador junto con el ID de la credencial y la clave pública. Estos datos son esenciales para los flujos de autenticación.
Maneja los arrays vacíos con elegancia: Cuando recibas un array de transportes vacío de los autenticadores de plataforma de iOS:
["internal", "hybrid"] para controlar qué opciones de autenticación se muestran.Realiza pruebas en todas las plataformas de destino: Crea una matriz de pruebas que cubra todas las combinaciones:
Entiende la diferencia entre un array vacío y una propiedad ausente: Tanto un array de transportes vacío [] como una propiedad de transportes ausente suelen tratarse como "cualquier transporte es aceptable" según la especificación. Sin embargo, los detalles de implementación varían entre plataformas.
Supervisa los cambios en las plataformas: Las implementaciones de WebAuthn evolucionan. Apple, Google y Microsoft actualizan regularmente el comportamiento de sus autenticadores. Mantente informado sobre los cambios que puedan afectar al manejo de los transportes.
Los transportes de WebAuthn, especialmente los internos e híbridos, son detalles técnicos con un impacto práctico significativo en la autenticación entre dispositivos. Tu estrategia de manejo de transportes debe alinearse con tu enfoque general de implementación de passkeys y tus plataformas de destino.
Las decisiones sobre transportes forman parte de una estrategia más amplia: La forma en que manejas los transportes depende de si buscas la máxima flexibilidad (con allowCredentials vacío) o una experiencia de usuario adaptada al consumidor (primero el identificador con credenciales específicas). Esta última opción hace que los transportes sean cruciales para la optimización.
Las diferencias entre plataformas requieren un manejo específico: La web y Android proporcionan información de transporte fiable, mientras que los autenticadores de plataforma de iOS devuelven arrays vacíos. Windows Hello solo envía ["internal"]. Entender estas diferencias es esencial para las implementaciones en producción.
Dos enfoques válidos para los transportes: El enfoque conforme a la especificación (confiar en los transportes del autenticador) funciona bien para escenarios empresariales y de máxima flexibilidad. El control explícito (optimizar los transportes) se adapta a las aplicaciones de consumo con flujos de "primero el identificador" y aplicaciones móviles nativas.
El flujo de "primero el identificador" permite la optimización de transportes: Cuando los usuarios proporcionan primero su identificador, el manejo de transportes se convierte en una potente herramienta de experiencia de usuario. Puedes evitar códigos QR no deseados en móviles, ocultar opciones de llaves de seguridad y simplificar la autenticación, sin preocupaciones adicionales de enumeración de cuentas.
Para empresas / Máxima flexibilidad:
allowCredentials vacío para admitir todos los tipos de autenticadores.Para aplicaciones de consumo / Aplicaciones nativas:
authenticatorAttachment: "platform").allowCredentials con credenciales específicas y transportes optimizados.preferImmediatelyAvailableCredentials en aplicaciones nativas.["hybrid", "internal"].hybrid en dispositivos móviles para evitar códigos QR.Para plataformas que ya tienen flujos de "primero el identificador":
Comienza con el enfoque conforme a la especificación y luego optimiza según tu estrategia:
El panorama de WebAuthn sigue evolucionando. Los proveedores de plataformas actualizan regularmente sus implementaciones y especificaciones como WebAuthn Nivel 3 introducen nuevas capacidades. Construir sistemas flexibles que alineen el manejo de transportes con tu estrategia de autenticación más amplia garantiza que tu implementación de passkeys se mantenga robusta y ofrezca excelentes experiencias de usuario a medida que el ecosistema madura.
Related Articles
Table of Contents