Este artículo explica cómo implementar passkeys en aplicaciones nativas (iOS + Android). Aprenderás qué tipo de WebView se recomienda para la autenticación con passkeys.

Vincent
Created: June 20, 2025
Updated: December 10, 2025

See the original blog version in English here.
+70-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
| Enfoque | Adopción | Crear Passkeys | Usar Passkeys | Gestionar Passkeys | Complejidad técnica | Soporte OAuth |
|---|---|---|---|---|---|---|
| Implementación nativa | 🟢🟢🟢 | Alta adopción, mejor UX, biométrica fluida | Autenticación instantánea y silenciosa | Control nativo total | Media-Alta | Requiere flujo separado |
| System WebView | 🟢🟢 | Buena adopción, experiencia similar al navegador | UX estándar de navegador, llavero compartido | Gestión basada en navegador | Baja | Excelente |
| Embedded WebView | 🟢 | Menor adopción, requiere más configuración | Soporte nativo en iOS y Android (WebKit 1.12.1+), sin Conditional UI | Control limitado | Media-Alta | N/D |
Nota: System WebView y Embedded WebView a menudo se combinan, donde System WebView gestiona el inicio de sesión (con credenciales compartidas automáticamente) y luego Embedded WebView renderiza la gestión de passkeys en los ajustes.
Factores clave de decisión:
Las plataformas móviles modernas ofrecen tres enfoques distintos para integrar passkeys en tu aplicación nativa, cada uno con diferentes ventajas y desventajas en cuanto a experiencia de usuario, complejidad técnica y compatibilidad con OAuth:
Implementación nativa: Construye los flujos de passkeys directamente en tu aplicación usando las API de la plataforma (AuthenticationServices en iOS, Credential Manager en Android). Proporciona la mejor experiencia de usuario con una autenticación biométrica fluida, pero requiere un esfuerzo de implementación técnica de medio a alto.
System WebView: Usa el componente de navegador de la plataforma (ASWebAuthenticationSession / SFSafariViewController en iOS, Chrome Custom Tabs en Android) para gestionar la autenticación. Es excelente para flujos de inicio de sesión basados en OAuth y comparte credenciales con el navegador del sistema.
Embedded WebView: Incrusta una vista web personalizable (WKWebView en iOS, WebView en Android) dentro de tu aplicación para reutilizar la autenticación web con un esqueleto de aplicación nativa. Proporciona una apariencia similar a la nativa sin barras de URL y control total sobre la UI de la vista web. Requiere configuración adicional, incluyendo permisos y entitlements (iOS), y configuración de WebView con AndroidX WebKit 1.12.1+ (Android) para habilitar la funcionalidad de passkeys.
La elección correcta depende de la arquitectura de autenticación de tu aplicación, si usas proveedores OAuth, cuánto control necesitas sobre la interfaz de usuario y si estás construyendo una aplicación principalmente nativa o reutilizando componentes web.
Recent Articles
Una implementación nativa de passkeys proporciona la experiencia de usuario óptima, con flujos de autenticación construidos directamente en la interfaz de usuario de tu aplicación mediante API específicas de la plataforma. Los usuarios se benefician de diálogos nativos de la plataforma, verificación biométrica fluida y los tiempos de inicio de sesión más rápidos posibles.
Cuándo elegir la implementación nativa:
preferImmediatelyAvailableCredentials para
mostrar automáticamente una superposición de passkeys
cuando hay passkeys disponibles, proporcionando la experiencia de inicio de sesión más
rápida sin necesidad de introducir un identificadorVentaja clave: preferImmediatelyAvailableCredentials()
Las implementaciones nativas pueden aprovechar preferImmediatelyAvailableCredentials()
para crear una
superposición automática de passkeys
que aparece inmediatamente al iniciar la aplicación cuando hay passkeys disponibles. Este
flujo sin nombre de usuario proporciona la experiencia de inicio de sesión más rápida
posible: los usuarios ven sus passkeys al instante sin tener que introducir primero un
identificador. Esta capacidad es exclusiva de las implementaciones nativas y no está
disponible en las variantes de WebView.
Aunque las implementaciones de WebView pueden usar Conditional UI (sugerencias de passkeys en los campos de entrada), la superposición automática de las implementaciones nativas proporciona una UX superior con tasas de uso de passkeys más altas, ya que la autenticación comienza inmediatamente al lanzar la aplicación.
Resumen de requisitos técnicos:
La integración nativa de passkeys requiere una confianza criptográfica entre tu aplicación y tu dominio web. Sin ella, el sistema operativo rechazará todas las operaciones de WebAuthn. Requisitos clave:
/.well-known/El principal beneficio: los passkeys creados en tu sitio web funcionan perfectamente en tu aplicación y viceversa.
Implementar passkeys de forma nativa en iOS implica el uso del framework AuthenticationServices de Apple, que proporciona una API para operaciones WebAuthn:
Componentes clave:
ASAuthorizationController: Gestiona el flujo de autenticaciónASAuthorizationPlatformPublicKeyCredentialProvider: Crea solicitudes de passkeysConsejos de desarrollo
?mode=developer a la URL de tu AASA para forzar una
nueva obtención.La implementación nativa de passkeys en Android utiliza la API Credential Manager (o la API más antigua de FIDO2 para retrocompatibilidad):
Componentes clave:
CredentialManager: API central para todas las operaciones de credencialesCreatePublicKeyCredentialRequest: Para el
registro de passkeysGetCredentialRequest: Para la autenticación con passkeysNota: Actualmente, Android carece de las sugerencias de teclado de la Conditional UI de iOS en aplicaciones nativas (aunque la Conditional UI funciona en aplicaciones web).
Implementar passkeys de forma nativa presenta desafíos y lecciones aprendidas importantes. La integración a nivel de sistema operativo puede sacar a la luz problemas en diferentes dispositivos y versiones de SO.
apple-app-site-association (usado para vincular
credenciales de app/web) y sutiles diferencias de interfaz de usuario en las
solicitudes biométricas de ciertos fabricantes de Android.Aunque se pueden implementar passkeys usando las API nativas de la plataforma, los SDKs específicos aceleran significativamente el desarrollo al gestionar la complejidad de WebAuthn, los casos límite y proporcionar telemetría integrada. Los SDKs también ofrecen interfaces simulables para pruebas unitarias (crucial, ya que no se pueden probar datos biométricos en simuladores).
Recomendación: Para implementaciones nativas, recomendamos usar los SDKs de Corbado (SDK de Passkey para iOS en Swift, SDK de Passkey para Android en Kotlin), que gestionan los numerosos casos límite descubiertos a través de despliegues en producción, proporcionan telemetría adicional y facilitan las pruebas.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
Corbado proved to be a trusted partner. Their hands-on, 24/7 support and on-site assistance enabled a seamless integration into VicRoads' complex systems, offering passkeys to 5 million users.
Passkeys que millones adoptan, rápidamente. Empieza con la Plataforma de Adopción de Corbado.
Comenzar prueba gratuitaLos System WebView utilizan el componente de navegador nativo de la plataforma para gestionar la autenticación dentro de tu aplicación. A diferencia de las implementaciones totalmente nativas, los System WebView muestran contenido web utilizando el navegador real del sistema (Safari en iOS, Chrome en Android), manteniendo cookies compartidas, credenciales guardadas y los familiares indicadores de seguridad del navegador.
Cuándo elegir System WebView:
Ventajas clave:
Componentes de la plataforma:
ASWebAuthenticationSession (recomendado para flujos de autenticación) o
SFSafariViewController (navegación general).Grandes empresas como Google y GitHub adoptaron este enfoque para añadir el inicio de sesión con passkey a sus aplicaciones móviles mediante superposiciones de WebView sobre las páginas de autenticación web existentes. Esto funciona bien cuando la reconstrucción completa de la autenticación nativa no es factible de inmediato.
iOS proporciona dos componentes principales de System WebView para la autenticación:
ASWebAuthenticationSession (Recomendado para autenticación):
SFSafariViewController (Navegación general):
| Característica | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| Caso de uso principal | Flujos de autenticación | Navegación web general |
| OAuth/OIDC | Excelente | Bueno |
| Soporte de Passkey | Sí | Sí |
| Personalización | Limitada | Mínima |
Si tu aplicación utiliza un inicio de sesión basado en OAuth,
ASWebAuthenticationSession es la opción recomendada, ya que está diseñada
específicamente para escenarios de autenticación y proporciona el mejor equilibrio entre
seguridad y experiencia de usuario.
Los Chrome Custom Tabs (CCT) proporcionan una experiencia de autenticación impulsada por Chrome dentro de tu aplicación:
Características clave:
Integración con OAuth: Los Chrome Custom Tabs son el equivalente en Android de ASWebAuthenticationSession en iOS, proporcionando un excelente soporte para OAuth mientras se mantiene el acceso a los passkeys almacenados.
Los Embedded WebView proporcionan un control total sobre la renderización del contenido web dentro de tu aplicación, permitiendo la manipulación directa de cookies, sesiones y navegación sin una barra de URL. Sin embargo, este control conlleva requisitos técnicos adicionales para habilitar la funcionalidad de passkeys.
Cuándo elegir Embedded WebView:
Contexto importante:
Muchas aplicaciones utilizan un enfoque híbrido: System WebView gestiona la autenticación OAuth inicial (donde los passkeys funcionan sin problemas), y luego cambian a Embedded WebView después de la autenticación para gestionar los passkeys en los ajustes. Los desafíos surgen al intentar usar passkeys directamente dentro de los Embedded WebViews.
Requisitos técnicos:
Los Embedded WebViews requieren una configuración adicional en comparación con los System WebViews:
Componentes de la plataforma:
WKWebViewandroid.webkit.WebViewVentajas y desventajas:
Al implementar passkeys a través de WebViews, es crucial entender la distinción entre System WebViews y Embedded WebViews. Los tres enfoques descritos anteriormente (Implementación nativa, System WebView y Embedded WebView) sirven para diferentes casos de uso.
En iOS, tienes múltiples opciones para mostrar contenido web dentro de la aplicación:
En Android, las principales opciones son:
android.webkit.WebView), que es
esencialmente un mini navegador que se puede incrustar en tus actividades. Es muy
personalizable pero se ejecuta en el proceso de tu aplicación.En las siguientes secciones, profundizaremos un poco más en estos tipos de WebView para iOS y Android, y discutiremos cuál podría ser el más adecuado para los flujos de autenticación con passkeys.
La plataforma de Apple proporciona las tres opciones de WebView mencionadas anteriormente. Tu elección afectará la fluidez con la que se puedan usar los passkeys dentro de la aplicación:
Para probar el comportamiento de los diferentes WebViews en iOS, recomendamos la aplicación WebView - WKWebView and UIWebView rendering.
WKWebView es un componente WebView versátil para iOS. Los desarrolladores pueden incrustar un WKWebView para renderizar contenido web con un alto grado de control sobre la interfaz de usuario y el comportamiento. WKWebView utiliza el mismo motor de renderizado que Safari, por lo que tiene un gran rendimiento y es compatible con las características web modernas. En teoría, WKWebView puede manejar WebAuthn (y por lo tanto, passkeys) si se configura correctamente, pero ten en cuenta que algunas características avanzadas del navegador pueden estar restringidas por seguridad. Algo a tener en cuenta es que WKWebView, por defecto, no comparte cookies ni datos del llavero con Safari Móvil. Es posible que los usuarios tengan que iniciar sesión de nuevo porque su sesión de WebView está aislada de la sesión de Safari. Además, como el contenido de WKWebView puede ser totalmente personalizado por la aplicación, el usuario no ve una barra de direcciones ni la interfaz de Safari, lo que es genial para la marca, pero significa que el usuario tiene menos pistas para verificar la legitimidad de la página (una preocupación para evitar el phishing). Algunas aplicaciones incluso han abusado de WKWebView para inyectar scripts o alterar contenido (p. ej., se señaló que TikTok inyectaba JS de seguimiento a través de su navegador en la aplicación), por lo que se debe tener cuidado de usar WKWebView de una manera segura y confiable para el usuario.
SFSafariViewController proporciona una experiencia de Safari dentro de la aplicación. Cuando abres una URL con SFSafariViewController, es casi como abrirla en el navegador Safari real, excepto que el usuario permanece dentro de la interfaz de usuario de tu aplicación. La ventaja para los passkeys es significativa: como es esencialmente Safari, el llavero de iCloud del usuario y los passkeys guardados son accesibles. Ten en cuenta que las cookies no se comparten en iOS 11+. Esto significa que si el usuario ya tiene un passkey para tu sitio, Safari puede encontrarlo e incluso mostrar el autocompletado de la Conditional UI para un inicio de sesión fácil. SFSafariViewController es menos personalizable (no puedes cambiar mucho su barra de herramientas), pero gestiona automáticamente muchas características de seguridad y privacidad. Se muestra la barra de URL, con el icono del candado para HTTPS, lo que da a los usuarios la confianza de que están en el dominio correcto. En general, SFSafariViewController se considera más seguro que un WKWebView sin procesar y es más sencillo de implementar (Apple lo proporciona como un componente listo para usar). La principal desventaja es que sacrificas algo de control sobre la apariencia. Para un flujo de autenticación, eso suele ser aceptable. La prioridad aquí es la seguridad y la facilidad de inicio de sesión, en lo que SFSafariViewController sobresale al usar el contexto de Safari.
| WKWebView | SFSafariViewController | |
|---|---|---|
| Experiencia de usuario | - Sensación nativa: Los usuarios pueden sentir que el contenido web es una parte nativa de la aplicación porque los desarrolladores pueden personalizar la apariencia para que coincida con el diseño de la aplicación. - Autocompletado: Es posible el autocompletado con datos de Safari | - Fluida: Experiencia de usuario fluida utilizando la configuración de Safari del usuario, lo que garantiza una navegación web consistente entre la aplicación nativa y el navegador. |
| Experiencia del desarrollador | - Altamente personalizable: Amplia personalización y configuración disponibles - Flexible: Muchas API para interactuar con el contenido web | - Medianamente personalizable: Opciones de personalización limitadas, especialmente en comparación con WKWebView. - Sencillo: Más sencillo de implementar en comparación con WKWebView |
| Rendimiento | - Bastante lento: Dependiendo de la implementación y el contenido web, las velocidades de carga se pueden optimizar, pero aún pueden ser más lentas en comparación con SFSafariViewController debido al procesamiento adicional de características e interacciones personalizadas. | - Bastante rápido: Normalmente ofrece un mejor rendimiento ya que aprovecha el motor de Safari, que está optimizado para la velocidad y la eficiencia, proporcionando tiempos de carga rápidos para las páginas web. |
| Confianza y reconocimiento | - No requiere mostrar la URL: WKWebView a menudo no muestra la URL, lo que dificulta que los usuarios verifiquen la página web. Potencial para que aplicaciones maliciosas imiten este comportamiento y hagan phishing de credenciales. | - Experiencia similar a un navegador: Renderiza las páginas web usando Safari, proporcionando una experiencia "similar a un navegador". Los usuarios pueden ver la URL y acceder a las funciones de autocompletado de Safari, lo que potencialmente infunde más confianza debido a la interfaz familiar. |
| Aislamiento | - Separado: Las cookies y las sesiones están separadas de Safari; los usuarios no iniciarán sesión automáticamente en un WKWebView. | - Separado: Las cookies y las sesiones están separadas de Safari; los usuarios tampoco iniciarán sesión automáticamente en SFSafariViewController. |
| Vulnerabilidades | - Seguro: Intrínsecamente seguro debido al sandboxing de aplicaciones de Apple, pero el comportamiento y la seguridad dependen de la implementación de la aplicación. Vulnerabilidades potenciales si no se implementa correctamente. | - Más seguro: Se beneficia de las características de seguridad integradas de Safari, incluidas las advertencias anti-phishing y de sitios web maliciosos. Generalmente se considera más seguro para mostrar contenido web que WKWebView debido a estas características y a la familiaridad del usuario con Safari. |
| Otros | - Características no disponibles: Es posible que algunas características del navegador (p. ej., WebAuthn) no sean totalmente accesibles debido a preocupaciones de seguridad y a que WKWebView se ejecuta en el contexto de la aplicación. - Inyección de JavaScript: Algunas aplicaciones, p. ej., TikTok inyectan JavaScript de seguimiento en su WKWebView dentro de la aplicación, o restringen el control del usuario (p. ej., Facebook) - Problemas de privacidad: Más comentarios de la comunidad sobre la privacidad | - Sin inyección de JavaScript: No permite la ejecución de JavaScript desde la aplicación, lo que mejora la seguridad y la privacidad. Tampoco admite alertas o confirmaciones de JavaScript, lo que podría afectar la experiencia del usuario en ciertas páginas web. - Modo Lector: Proporciona un modo lector para una versión limpia y fácil de leer de los artículos. |
SFAuthenticationSession / ASWebAuthenticationSession – Estas clases (la última es el nombre más nuevo y amigable con Swift) están diseñadas específicamente para flujos de inicio de sesión como OAuth u OpenID Connect. Cuando necesitas autenticar a un usuario a través de una página web (quizás a un IdP externo), estas sesiones son la opción recomendada en iOS. Son muy similares a SFSafariViewController en que utilizan el navegador Safari internamente y comparten cookies/almacenamiento con Safari. La diferencia clave es que SFAuthenticationSession siempre le pedirá al usuario que la aplicación quiere autenticarse usando una página web (para la conciencia del usuario) y usará automáticamente la sesión de Safari existente del usuario si está disponible.
El beneficio es una experiencia de SSO fluida: si el usuario ya ha iniciado sesión en el proveedor en Safari, esta sesión puede usar esa cookie para evitar otro inicio de sesión. Para los passkeys, esto es importante porque significa que cualquier credencial de passkey almacenada en Safari/iCloud Keychain también se puede usar aquí. La guía oficial de Apple es usar ASWebAuthenticationSession para cualquier cosa que parezca un flujo de inicio de sesión. Las ventajas son una mayor privacidad (tu aplicación nunca ve las credenciales o las cookies, Safari se encarga de ello) y el soporte de SSO integrado. La desventaja es que se limita a los flujos de autenticación (no lo usarías solo para renderizar contenido web arbitrario en tu aplicación). En resumen, si eliges un enfoque de WebView en iOS, ASWebAuthenticationSession suele ser la mejor opción para implementar passkeys porque es seguro, comparte el estado con Safari y está diseñado específicamente para la autenticación.
En Android, la decisión sobre WebView se reduce al WebView clásico y los Chrome Custom Tabs:
Para probar el comportamiento de los diferentes WebViews en Android, recomendamos la aplicación WebView vs Chrome Custom Tabs.
Android WebView (android.webkit.WebView) es un componente que te permite incrustar páginas web en el diseño de tu actividad. Es similar a WKWebView en que te da control total: puedes interceptar la navegación, inyectar JavaScript, personalizar la interfaz de usuario, etc. También se ejecuta dentro del proceso de tu aplicación. Usar un WebView para passkeys significa que tu aplicación carga tu página de inicio de sesión web, y esa página puede iniciar una ceremonia de passkey con WebAuthn. El WebView de Android moderno sí admite WebAuthn (siempre que la implementación de WebView del dispositivo esté actualizada a través de Android System WebView o el componente de Chrome). Una consideración importante: por defecto, un WebView de Android no comparte cookies ni credenciales almacenadas con el navegador Chrome del usuario. Por lo tanto, cualquier passkey creado o utilizado en el WebView podría no ser conocido por Chrome, y viceversa. Este aislamiento puede ser bueno para la seguridad (tu aplicación no puede leer las cookies del navegador), pero podría obligar a los usuarios a iniciar sesión de nuevo si ya se han autenticado en Chrome. Otro problema es la confianza. Un WebView simple no muestra la URL ni el icono del candado SSL, por lo que los usuarios tienen que confiar completamente en que tu aplicación no les hará phishing. Google incluso ha prohibido el uso de WebView para los inicios de sesión de Google OAuth debido a los riesgos potenciales de phishing. En cuanto al rendimiento, los WebViews están bien, pero pueden ser más lentos o consumir más memoria que usar el navegador predeterminado del usuario, especialmente si se cargan páginas pesadas.
Chrome Custom Tabs (CCT) son un enfoque híbrido. Permiten que tu aplicación abra una página renderizada por Chrome que parece parte de tu aplicación. Puedes personalizar el color de la barra de herramientas, añadir un logo de la aplicación, etc., pero el contenido es renderizado por Chrome en un proceso separado. Para los passkeys, los CCT tienen varios beneficios: comparten las cookies y credenciales del usuario con Chrome, lo que significa que si el usuario tiene un passkey guardado a través de Chrome (Google Password Manager), la Custom Tab puede acceder a él. El usuario también verá la URL real y los indicadores de seguridad, lo que genera confianza. El rendimiento suele ser mejor: Chrome puede ser "precalentado" en segundo plano para una carga más rápida. Y lo que es más importante, la seguridad es fuerte: como es esencialmente la aplicación de Chrome, cosas como Google Safe Browsing protegen la sesión, y tu aplicación no puede inyectar scripts arbitrarios en la página (previniendo ciertos ataques).
La desventaja es que requiere que el usuario tenga Chrome (o un navegador compatible) instalado y actualizado. La mayoría de los usuarios de Android lo tienen, pero en algunos dispositivos de ciertas regiones, esto podría ser un problema. En general, si optas por un enfoque web incrustado en Android, se recomiendan los Chrome Custom Tabs para los flujos de passkeys, ya que proporcionan un buen equilibrio entre integración y seguridad. De hecho, son análogos a SFSafariViewController/ASWebAuthSession de iOS en muchos aspectos: aprovechan el navegador predeterminado para la autenticación.
(Aparte: WKWebView vs SFSafariViewController de Apple y WebView vs CCT de Android tienen muchos paralelismos. Tanto Safari VC como Chrome Tabs comparten el estado del navegador y proporcionan una mejor seguridad, mientras que WKWebView/Android WebView dan más control pero aíslan el contenido web. Para los passkeys, compartir el estado (cookies, almacenes de credenciales) suele ser deseable para que el passkey se pueda acceder y crear sin problemas.)
| Característica | WebView | Chrome Custom Tab |
|---|---|---|
| Experiencia de usuario | - Flexibilidad: Proporciona un amplio conjunto de API para interactuar con el contenido web y gestionar las interacciones del usuario, incluido el manejo de diálogos de JavaScript y solicitudes de permisos. - Consistencia: Gestionar una UX consistente, especialmente con contenido web variado, puede ser un desafío. | - Características del navegador: Comparte características como el Ahorro de datos y el Autocompletado sincronizado entre dispositivos. - Botón Atrás: Permite a los usuarios volver fácilmente a la aplicación con un botón de retroceso integrado. - Dependencia: Depende de la aplicación Chrome, que podría no estar disponible o actualizada en todos los dispositivos de los usuarios. - Redirección al navegador: Ciertas funcionalidades podrían redirigir a los usuarios a la aplicación Chrome, interrumpiendo potencialmente la experiencia del usuario. - Partial Custom Tabs: Solo se puede usar una parte de la pantalla para el Chrome Custom Tab mientras que el resto muestra la aplicación nativa. - Hoja lateral: En modo apaisado y en dispositivos de pantalla grande, el Chrome Custom Tab solo se muestra en un lado de la pantalla, mientras que el resto de la pantalla muestra la aplicación nativa. |
| Experiencia del desarrollador | - Altamente personalizable: Ofrece amplias opciones/necesidades de personalización. - Interactividad: Proporciona numerosas API para interactuar con el contenido web y gestionar las interacciones del usuario. | - Personalizable: Permite la personalización del color de la barra de herramientas, el botón de acción, la barra de herramientas inferior, elementos de menú personalizados y animaciones de entrada/salida. - Callback: Entrega un callback a la aplicación tras una navegación externa. - Características de seguridad: Proporciona características listas para usar, eliminando la necesidad de gestionar solicitudes, concesiones de permisos o almacenes de cookies. |
| Rendimiento | - Rendimiento mediocre: Puede que no ofrezca el mismo nivel de rendimiento que los Chrome Custom Tabs (CCT). | - Pre-calentamiento: Incluye el pre-calentamiento del navegador en segundo plano y la carga especulativa de URL para mejorar el tiempo de carga de la página. - Prioridad: Evita que las aplicaciones que lanzan una Custom Tab sean eliminadas durante su uso elevando su importancia al nivel de "primer plano". |
| Confianza y reconocimiento | - URL y SSL no visibles: La información de la URL y el SSL no es inherentemente visible en un WebView. A menos que el desarrollador de la aplicación implemente estas características, los usuarios no sabrán si están en el sitio web correcto o en uno de phishing. | - URL y SSL visibles: Utiliza el navegador Chrome real para renderizar las páginas. Los usuarios pueden ver la URL y el certificado SSL (que indica si la conexión es segura). Esto puede dar a los usuarios la confianza de que no están en un sitio de phishing. |
| Aislamiento | - Se ejecuta dentro del proceso de la aplicación: Si una aplicación tiene una vulnerabilidad que permite la ejecución de código malicioso, existe el riesgo de que el WebView pueda verse comprometido. Sin embargo, WebView también recibe actualizaciones, pero su comportamiento y seguridad pueden depender más de la aplicación que lo utiliza. - Sin uso compartido de cookies/sesiones: No comparte cookies ni sesiones con el navegador principal del dispositivo, lo que ofrece aislamiento pero posiblemente requiere que los usuarios inicien sesión de nuevo. | - Se ejecuta dentro del proceso de Chrome: Al ser parte de Chrome, las Custom Tabs se ejecutan en el mismo proceso y tienen las mismas actualizaciones y características de seguridad que Chrome. - Uso compartido de cookies y modelo de permisos: Asegura que los usuarios no tengan que volver a iniciar sesión en los sitios ni a conceder permisos de nuevo. - Ajustes y preferencias de Chrome: Utiliza los ajustes y preferencias de Chrome. |
| Vulnerabilidades | - Callbacks para robar credenciales: Las vulnerabilidades potenciales incluyen que a veces se requiere JavaScript, lo que abre la puerta para que otras aplicaciones ejecuten código malicioso, como registrar callbacks que intentan interceptar nombres de usuario y contraseñas. - Phishing: Además, una aplicación maliciosa podría abrir otra página web que imite el flujo de Link en un intento de phishing. | - Google Safe Browsing: Emplea Google Safe Browsing para proteger tanto al usuario como al dispositivo de sitios peligrosos. - Decoración segura del navegador: Asegura que el usuario siempre vea la URL exacta con la que está interactuando y pueda ver la información del certificado del sitio web, reduciendo el riesgo de phishing. Además, las custom tabs no permiten la inyección de JavaScript. |
| Otros | - Google prohibió los WebViews para iniciar sesión de usuarios en cuentas de Google |
Independientemente del enfoque de implementación que elijas, se deben cumplir ciertos requisitos técnicos para habilitar la funcionalidad de passkeys. Esta sección proporciona una guía completa sobre cómo configurar los archivos de asociación well-known, los entitlements de iOS y la configuración de WebView en Android.
Nota sobre dispositivos gestionados: El comportamiento de los passkeys cambia significativamente en dispositivos gestionados donde las políticas de gestión de dispositivos móviles (MDM) controlan el almacenamiento de credenciales. Para probar passkeys en dispositivos gestionados, consulta Passkeys en dispositivos gestionados de iOS y Android.
Los flujos nativos y de Embedded WebView requieren archivos de asociación para establecer una confianza criptográfica entre tu aplicación y tu dominio web. System WebView (ASWebAuthenticationSession) y Chrome Custom Tabs no requieren asociación de aplicación a sitio.
El archivo AASA establece la conexión entre tu aplicación de iOS y tu dominio web, permitiendo que los passkeys funcionen en ambas plataformas.
Ubicación del archivo: https://tudominio.com/.well-known/apple-app-site-association
Requisitos de configuración:
/.well-known/apple-app-site-association en tu dominioapplication/json.well-knownEjemplo de archivo AASA:
{ "webcredentials": { "apps": ["TEAMID123.com.example.app"] } }
Caché y pruebas de AASA:
Apple almacena en caché los archivos AASA de forma agresiva (hasta 24-48 horas) usando una CDN, lo que puede frustrar el desarrollo y las pruebas. Para evitar la caché durante el desarrollo:
?mode=developer a tu dominio asociado en Xcode⚠️ Importante: NO uses ?mode=developer en las versiones de producción. Este
parámetro es solo para desarrollo; usarlo en producción evitará que iOS detecte
correctamente tu archivo AASA, rompiendo la funcionalidad de passkeys.
Validación: Usa el Validador de AASA de Apple para verificar tu configuración.
Android usa Digital Asset Links para verificar la relación entre tu aplicación y tu sitio web.
Ubicación del archivo: https://tudominio.com/.well-known/assetlinks.json
Requisitos de configuración:
/.well-known/assetlinks.json en tu dominioapplication/jsonEjemplo de archivo assetlinks.json:
[ { "relation": [ "delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds" ], "target": { "namespace": "android_app", "package_name": "com.example.app", "sha256_cert_fingerprints": [ "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99" ] } } ]
Validación: Usa el Generador de Digital Asset Links de Google para crear y verificar tu configuración.
Las aplicaciones de iOS requieren los entitlements adecuados para acceder a la funcionalidad de passkeys. Los requisitos difieren ligeramente según tu enfoque de implementación.
El archivo de entitlements (a menudo llamado Runner.entitlements en aplicaciones de
Flutter o TuApp.entitlements en proyectos nativos de
iOS) define permisos y capacidades especiales otorgados por el sistema de Apple. Para los
passkeys, este archivo configura los Dominios Asociados.
Ubicación del archivo: Típicamente en tu proyecto de Xcode en
ios/Runner/Runner.entitlements
La implementación nativa y el Embedded WebView requieren la capacidad de Dominios Asociados para vincular tu aplicación con tu dominio web. System WebView (ASWebAuthenticationSession) no requiere esto ya que se ejecuta en el contexto de Safari.
Configuración en Xcode:
webcredentials:Ejemplo de configuración:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.associated-domains</key> <array> <string>webcredentials:tudominio.com</string> <string>webcredentials:subdominio.tudominio.com</string> </array> </dict> </plist>
| Enfoque | Dominios Asociados Requeridos | Configuración Adicional |
|---|---|---|
| Implementación nativa | Sí | Implementación dedicada |
| System WebView | No requerido | La configuración web predeterminada funciona |
| Embedded WebView | Sí | Requiere configuración de AndroidX WebKit 1.12.1+ |
Múltiples dominios: Si tu aplicación necesita funcionar con múltiples dominios, es posible que necesites Related Origin Requests (ROR).
Los Embedded WebViews de Android obtuvieron soporte nativo para WebAuthn con AndroidX WebKit 1.12, eliminando la necesidad de código de puente de JavaScript personalizado. System WebView (Chrome Custom Tabs) no requiere ninguna configuración, las credenciales funcionan automáticamente.
Requisitos:
Implementación:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Comprobar si se admite la autenticación web if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Habilitar la autenticación web WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Habilitar JavaScript webView.settings.javaScriptEnabled = true }
Puntos clave:
WebViewFeature.WEB_AUTHENTICATION en tiempo de ejecuciónmediation:"conditional" (autocompletado de
passkeys en campos de entrada) no funciona en Embedded WebViewNotas de versión:
Antes de AndroidX WebKit 1.12.0, no existía soporte nativo para WebAuthn en Embedded WebView. Los equipos tenían que:
Si necesitas dar soporte a versiones de Android más antiguas o a dispositivos sin APK de WebView actualizadas, consulta la guía de integración de Credential Manager WebView de Android para el enfoque del código de puente. Sin embargo, recomendamos encarecidamente usar el enfoque nativo de WebKit 1.12.1+ para las aplicaciones modernas.
Recomendación: Usa el soporte nativo de WebAuthn con AndroidX WebKit 1.12.1+. Si no está disponible en tiempo de ejecución, recurre a Chrome Custom Tabs, que proporciona un excelente soporte de passkeys con credenciales compartidas.
Al implementar passkeys en aplicaciones nativas, necesitas establecer confianza entre tu aplicación y tu(s) dominio(s) web. Esta sección cubre cómo manejar dominios únicos, múltiples dominios relacionados (ROR) y cómo verificar que tus archivos de asociación well-known estén configurados correctamente.
Para aplicaciones que usan un solo dominio (p. ej., kayak.com), necesitas:
webcredentials:kayak.comRelated Origins (ROR) es una
característica de WebAuthn que permite que un único conjunto de passkeys funcione en
múltiples dominios relacionados (p. ej., kayak.com, kayak.de, kayak.co.uk).
ROR utiliza el endpoint
/.well-known/webauthn en cada sitio para definir
orígenes relacionados,
NO los archivos AASA o assetlinks.
Puntos clave:
/.well-known/webauthn con la lista de
orígenes relacionadosEjemplo de configuración:
Si tu aplicación funciona con kayak.com y kayak.de, ambos dominios deben:
Antes de lanzar, verifica que tus archivos well-known estén configurados y accesibles correctamente. Apple y Google proporcionan URL de prueba basadas en CDN para comprobar la disponibilidad de los archivos:
| Dominio | Verificación AASA de Apple | Verificación de Digital Asset Links de Google |
|---|---|---|
| kayak.com | Probar archivo AASA Comprueba si la CDN de Apple puede recuperar tu archivo | Probar assetlinks.json Verifica que Google pueda acceder a tus asset links |
| kayak.de | Probar archivo AASA Comprueba si la CDN de Apple puede recuperar tu archivo | Probar assetlinks.json Verifica que Google pueda acceder a tus asset links |
Uso de estas URL de prueba:
?nocache=1 de Apple fuerza una recuperación nueva, evitando la caché de
la CDNkayak.com o kayak.de con tu(s) propio(s) dominio(s) en los patrones de URL
anterioresAdvertencia sobre las pruebas: Asegúrate de que todos los dominios tengan archivos well-known configurados correctamente. Un archivo faltante o mal configurado en cualquier dominio puede romper la funcionalidad de passkeys para ese dominio.
Más información: WebAuthn Relying Party ID en aplicaciones nativas
Elegir el enfoque de implementación correcto depende de la arquitectura de autenticación de tu aplicación, los requisitos de OAuth y la necesidad de control de sesión. Usa este árbol de decisiones para determinar el mejor camino a seguir.
Comienza con estas preguntas clave:
¿Tu aplicación utiliza inicio de sesión basado en OAuth (OAuth2, OIDC, proveedores de inicio de sesión social)?
ASWebAuthenticationSession¿Quieres reutilizar la autenticación web en una apariencia similar a la nativa (sin barra de URL, control total de la interfaz de usuario)?
WKWebView + entitlements de Dominios AsociadosWebView + configuración de AndroidX WebKit 1.12.1+¿Estás creando una nueva aplicación nativa o tienes pantallas de inicio de sesión nativas?
¿Tienes una autenticación web existente que quieres reutilizar?
Así es como se desempeña cada enfoque en dimensiones clave:
| Enfoque | Crear Passkeys | Usar Passkeys | Gestionar Passkeys | Complejidad técnica | Soporte OAuth | Tiempo de configuración |
|---|---|---|---|---|---|---|
| Implementación nativa | Alta adopción Biométrica fluida, mejor UX | Instantáneo, silenciosopreferImmediatelyAvailableCredentials permite una superposición automática al iniciar la app | Control nativo total Integrar con los ajustes de la app | Media-Alta API específicas de la plataforma | Requiere implementación de flujo OAuth separada | Semanas a meses |
| System WebView | Buena adopción Experiencia similar al navegador, familiar | UX estándar de navegador Conditional UI en campos de entrada, llavero compartido | Basado en navegador Los usuarios gestionan a través del navegador | Baja Código nativo mínimo | Excelente Diseñado para OAuth | Días a semanas |
| Embedded WebView | Menor adopción Requiere configuración | Soporte nativo de WebAuthn WebKit 1.12.1+, sin Conditional UI | Control limitado Sin integración nativa | Media-Alta Configuración de WebView + permisos | Requiere configuración | 1-2 semanas |
Explicación de las dimensiones:
Recomendado: System WebView
Si tu aplicación se autentica a través de OAuth2, OIDC o proveedores de inicio de sesión social (Google, GitHub, Microsoft, etc.), System WebView es la opción óptima:
ASWebAuthenticationSession está diseñado específicamente para flujos de
OAuth.Ejemplo: Aplicaciones de viajes como kayak.com y kayak.de usan OAuth para la autenticación. System WebView les permite mantener su infraestructura OAuth existente mientras añaden soporte para passkeys a través de sus páginas de autenticación web.
Recomendado: Enfoque híbrido
Usa System WebView para la autenticación OAuth inicial, y luego Embedded WebView para las sesiones posteriores a la autenticación:
Cuándo usarlo: Aplicaciones que se autentican a través de OAuth pero que luego necesitan mostrar contenido web autenticado donde se requiere manipulación directa de la sesión.
Recomendado: Implementación nativa
¿Estás construyendo desde cero o tienes pantallas nativas? Opta por lo totalmente nativo:
preferImmediatelyAvailableCredentials para mostrar una
superposición automática de passkeys al iniciar la aplicación -
exclusivo de las implementaciones nativas y que proporciona las
tasas de conversión más altas.Para nuevas aplicaciones: Recomendamos encarecidamente construir un inicio de sesión nativo desde el primer día. Esto te prepara para una UX óptima y evita futuras migraciones de WebView a nativo.
Recomendado: Migración por fases
Este enfoque por fases permite mejoras incrementales sin interrumpir a los usuarios existentes.
| Requisito | Nativo | System WebView | Embedded WebView |
|---|---|---|---|
| Archivos well-known (AASA/assetlinks) | Requerido | No requerido | Requerido |
| Dominios Asociados de iOS | Requerido | No requerido | Requerido |
| Biblioteca WebKit de Android | No aplicable | No requerido | Requerido (1.12.1+) |
| Relying Party ID | Debe coincidir con el dominio | Debe coincidir con el dominio | Debe coincidir con el dominio |
Consulta la Sección 5 para obtener instrucciones de configuración detalladas.
Probar los passkeys en aplicaciones nativas requiere un enfoque estructurado y de múltiples capas. Sigue la pirámide de pruebas: pruebas unitarias (lógica aislada), pruebas de integración (ceremonia de WebAuthn en simuladores/emuladores) y pruebas de sistema (de extremo a extremo en dispositivos físicos).
Categorías de prueba esenciales:
Para una guía completa de pruebas que incluye estrategias de automatización, problemas específicos de cada plataforma y una lista de verificación completa antes del lanzamiento, consulta nuestra guía dedicada: Prueba de flujos de Passkey en aplicaciones nativas de iOS y Android.
Considera la posibilidad de pedir a los usuarios que creen passkeys después de un inicio de sesión tradicional exitoso (contraseña, OAuth). Este enfoque de conversión gradual:
Ejemplo: Después del inicio de sesión con OAuth a través de System WebView, muestra un aviso nativo: "¿Habilitar un inicio de sesión más rápido con Face ID?". Si se acepta, crea el passkey a través de la página web cargada en System WebView.
Decidir cómo implementar los passkeys (mediante una implementación nativa, System WebView o Embedded WebView) es una elección de diseño crucial que afecta la seguridad, la experiencia del usuario y la complejidad del desarrollo. No hay una respuesta única para todos.
Para aplicaciones basadas en OAuth: System WebView (ASWebAuthenticationSession, Chrome Custom Tabs) es el punto de partida recomendado. Proporciona un excelente soporte para OAuth, un esfuerzo de implementación mínimo y el uso compartido automático de credenciales.
Para aplicaciones principalmente nativas: Ve a por lo nativo más pronto que tarde. Un
inicio de sesión con passkey nativo ofrece la UX más fluida con capacidades exclusivas
como preferImmediatelyAvailableCredentials, que permite una
superposición automática de passkeys al iniciar la aplicación,
algo que las implementaciones de WebView no pueden proporcionar. Con iOS y Android
ofreciendo ahora soporte de primera clase para passkeys, los éxitos en el mundo real
demuestran una alta adopción. Las herramientas (incluidos los SDK de código abierto y las
bibliotecas de la plataforma) han madurado para hacer que la integración nativa sea
factible en plazos razonables. Si bien debes tener en cuenta las políticas de gestión de
dispositivos, la sincronización entre dispositivos y los proveedores de terceros, estos
desafíos se pueden gestionar con una ingeniería y pruebas cuidadosas. El resultado es un
inicio de sesión de la aplicación que deleita a los usuarios por su facilidad y velocidad,
al tiempo que mejora significativamente la seguridad.
Para los requisitos del marco de Embedded WebView: Embedded WebView se usa comúnmente en dos escenarios del mundo real. Primero, las aplicaciones basadas en OAuth a menudo usan System WebView para el flujo de inicio de sesión inicial, y luego cambian a Embedded WebView para renderizar las opciones de gestión de passkeys en las pantallas de configuración donde se necesita control de la sesión, aunque algunas aplicaciones simplifican esto manteniendo System WebView para ambos flujos. Segundo, las aplicaciones que ya incrustaron su flujo de autenticación en marcos de WebView antes de adoptar passkeys continúan este patrón por consistencia. Embedded WebView con soporte nativo de WebAuthn (AndroidX WebKit 1.12.1+) requiere configuración (permisos, entitlements, ajustes de WebView) pero ya no necesita código de puente de JavaScript personalizado. Ten en cuenta que Conditional UI no es compatible en Embedded WebView. Elige este enfoque cuando mantengas patrones de autenticación incrustados existentes o cuando necesites control de sesión/cookies para las pantallas posteriores a la autenticación.
En última instancia, los passkeys en aplicaciones nativas representan un gran salto adelante tanto en la comodidad del usuario como en la seguridad. Ya sea que se implementen a través de Nativo, System WebView o Embedded WebView, eliminan los riesgos de phishing y las cargas de la gestión de contraseñas para tus usuarios. Las implementaciones en el mundo real como la integración de passkeys en la aplicación nativa de VicRoads demuestran que los enfoques principalmente nativos ofrecen la mayor adopción y satisfacción del usuario cuando se ejecutan correctamente con características como las superposiciones automáticas de passkeys. Siguiendo las mejores prácticas para una autenticación amigable para el usuario y eligiendo el enfoque de implementación que se ajuste a la arquitectura de tu aplicación (nativo para nuevas aplicaciones, System WebView para flujos de OAuth o Embedded WebView para patrones incrustados existentes), puedes ofrecer inicios de sesión biométricos sin contraseña que realmente hagan realidad la visión de los passkeys: una autenticación simple, segura y agradable para todos.
Si los passkeys no funcionan en tu aplicación nativa, verifica estos problemas comunes según el enfoque de implementación:
application/json..well-known.https://tu-dominio.com (no app://).webcredentials:tudominio.com.ASWebAuthenticationSession (recomendado) o SFSafariViewController.?mode=developer durante el desarrollo (eliminar para producción).WebViewFeature.WEB_AUTHENTICATION.setWebAuthenticationSupport() con
WEB_AUTHENTICATION_SUPPORT_FOR_APP."NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport().No aparece el aviso de passkey
?mode=developer en iOS para las
pruebas, verificar el tipo de WebView.Para una depuración detallada, consulta nuestro artículo sobre IDs de Relying Party en aplicaciones nativas.
SDKs nativos de Corbado:
Documentación de la plataforma:
Herramientas de validación:
Related Articles
Passkey Tutorial: How to Implement Passkeys in Web Apps
Vincent - December 7, 2023
The High-Level Architecture of an Integrated Passkey Flow
Janina - December 21, 2022
Table of Contents