В этой статье объясняется, как реализовать ключи доступа в нативных приложениях (iOS + Android). Вы узнаете, какой тип WebView рекомендуется для аутентификации с помощью ключей доступа.

Vincent
Created: June 20, 2025
Updated: November 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
| Подход | Принятие | Создание Passkeys | Использование Passkeys | Управление Passkeys | Техническая сложность | Поддержка OAuth |
|---|---|---|---|---|---|---|
| Нативная реализация | 🟢🟢🟢 | Высокое принятие, лучший UX, бесшовная биометрия | Мгновенная, бесшумная аутентификация | Полный нативный контроль | Средняя-Высокая | Требует отдельного потока |
| System WebView | 🟢🟢 | Хорошее принятие, опыт как в браузере | Стандартный UX браузера, общая связка ключей | Управление через браузер | Низкая | Отличная |
| Embedded WebView | 🟢 | Низкое принятие, требует больше настроек | Нативная поддержка в iOS и Android (WebKit 1.12.1+), нет Conditional UI | Ограниченный контроль | Средняя-Высокая | Н/Д |
Примечание: System WebView и Embedded WebView часто комбинируют: System WebView обрабатывает вход в систему (с автоматическим доступом к учетным данным), а затем Embedded WebView отображает управление ключами доступа в настройках.
Ключевые факторы для принятия решения:
Современные мобильные платформы предлагают три различных подхода к интеграции ключей доступа в ваше нативное приложение, каждый из которых имеет свои компромиссы в плане пользовательского опыта, технической сложности и совместимости с OAuth:
Нативная реализация: Встройте потоки работы с ключами доступа непосредственно в ваше приложение, используя API платформы (AuthenticationServices для iOS, Credential Manager для Android). Обеспечивает лучший пользовательский опыт с бесшовной биометрической аутентификацией, но требует средних или высоких затрат на техническую реализацию.
System WebView: Используйте браузерный компонент платформы (ASWebAuthenticationSession / SFSafariViewController для iOS, Chrome Custom Tabs для Android), чтобы обрабатывать аутентификацию. Отлично подходит для потоков входа на основе OAuth и использует общие учетные данные с системным браузером.
Embedded WebView: Встройте настраиваемое веб-представление (WKWebView для iOS, Android WebView) в ваше приложение, чтобы повторно использовать веб-аутентификацию с нативной оболочкой. Обеспечивает внешний вид, подобный нативному, без URL-строки и с полным контролем над интерфейсом веб-представления. Требует дополнительной настройки, включая разрешения и права (entitlements) для iOS, а также конфигурацию WebView с AndroidX WebKit 1.12.1+ (Android) для включения функциональности ключей доступа.
Правильный выбор зависит от архитектуры аутентификации вашего приложения, использования провайдеров OAuth, степени необходимого контроля над UI и того, создаете ли вы приложение с нуля или повторно используете веб-компоненты.
Recent Articles
🔑
Мобильные водительские удостоверения уже здесь: полное руководство по mDL
📖
Связанные источники WebAuthn: руководство по междоменным Passkeys
🔑
Как полностью перейти на беспарольную аутентификацию
⚙️
Транспорты WebAuthn: внутренний и гибридный
♟️
Биометрия и осведомленность плательщика при динамическом связывании
Нативная реализация ключей доступа обеспечивает оптимальный пользовательский опыт, где потоки аутентификации встроены непосредственно в UI вашего приложения с помощью специфичных для платформы API. Пользователи получают преимущества в виде нативных диалоговых окон, бесшовной биометрической проверки и максимально быстрого входа в систему.
Когда выбирать нативную реализацию:
preferImmediatelyAvailableCredentials для
автоматического отображения оверлея с ключами доступа,
когда они доступны, обеспечивая самый быстрый вход без необходимости вводить
идентификаторКлючевое преимущество: preferImmediatelyAvailableCredentials()
Нативные реализации могут использовать preferImmediatelyAvailableCredentials() для
создания
автоматического оверлея с ключами доступа,
который появляется сразу при запуске приложения, если доступны ключи доступа. Этот поток
без ввода имени пользователя обеспечивает максимально быстрый вход в систему —
пользователи видят свои ключи доступа мгновенно, не вводя сначала идентификатор. Эта
возможность эксклюзивна для нативных реализаций и недоступна в вариантах с WebView.
Хотя реализации с WebView могут использовать Conditional UI (предложения ключей доступа в полях ввода), автоматический оверлей в нативных приложениях обеспечивает превосходный UX с более высокими показателями использования ключей доступа, так как аутентификация начинается сразу при запуске приложения.
Обзор технических требований:
Нативная интеграция ключей доступа требует криптографического доверия между вашим приложением и веб-доменом. Без него ОС будет отклонять все операции WebAuthn. Ключевые требования:
/.well-known/Главное преимущество: ключи доступа, созданные на вашем веб-сайте, без проблем работают в вашем приложении и наоборот.
Нативная реализация ключей доступа на iOS включает использование фреймворка AuthenticationServices от Apple, который предоставляет API для операций WebAuthn:
Ключевые компоненты:
ASAuthorizationController: Управляет потоком аутентификацииASAuthorizationPlatformPublicKeyCredentialProvider: Создает запросы на использование
ключей доступаСоветы по разработке
?mode=developer к URL вашего AASA, чтобы принудительно загрузить свежую
версиюНативная реализация ключей доступа на Android использует Credential Manager API (или более старый FIDO2 API для обратной совместимости):
Ключевые компоненты:
CredentialManager: Центральный API для всех операций с учетными даннымиCreatePublicKeyCredentialRequest: Для регистрации ключа доступаGetCredentialRequest: Для аутентификации с помощью ключа доступаПримечание: в нативных приложениях Android в настоящее время отсутствует аналог Conditional UI для iOS (предложения на клавиатуре), хотя Conditional UI работает в веб-приложениях.
Реализация ключей доступа нативно сопряжена с важными проблемами и уроками: интеграция на уровне ОС может выявить проблемы на разных устройствах и версиях ОС.
Хотя вы можете реализовать ключи доступа, используя "сырые" API платформы, специализированные SDK значительно ускоряют разработку, обрабатывая сложность WebAuthn, крайние случаи и предоставляя встроенную телеметрию. SDK также предлагают макетные интерфейсы для модульного тестирования (что крайне важно, поскольку вы не можете тестировать биометрию в симуляторах).
Рекомендация: Для нативных реализаций мы рекомендуем использовать SDK от Corbado (iOS Swift Passkey SDK, Android Kotlin Passkey SDK), которые обрабатывают многочисленные крайние случаи, обнаруженные в ходе производственных развертываний, и предоставляют дополнительную телеметрию и возможности для тестирования.
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, которые принимают миллионы. Быстро. Начните с платформы внедрения Corbado.
Начать бесплатноSystem WebView используют нативный браузерный компонент платформы для обработки аутентификации внутри вашего приложения. В отличие от полностью нативных реализаций, System WebView отображают веб-контент, используя фактический системный браузер (Safari на iOS, Chrome на Android), сохраняя общие cookie, сохраненные учетные данные и знакомые индикаторы безопасности браузера.
Когда выбирать System WebView:
Ключевые преимущества:
Компоненты платформы:
ASWebAuthenticationSession (рекомендуется для потоков аутентификации) или
SFSafariViewController (для общего просмотра).Крупные компании, такие как Google и GitHub, приняли этот подход для добавления входа по ключу доступа в свои мобильные приложения через оверлеи WebView на существующих страницах веб-аутентификации. Это хорошо работает, когда полная перестройка аутентификации на нативную основу не является немедленно осуществимой.
iOS предоставляет два основных компонента System WebView для аутентификации:
ASWebAuthenticationSession (Рекомендуется для аутентификации):
SFSafariViewController (Общий просмотр):
| Функция | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| Основное применение | Потоки аутентификации | Общий просмотр веба |
| OAuth/OIDC | Отлично | Хорошо |
| Поддержка Passkey | Да | Да |
| Кастомизация | Ограниченная | Минимальная |
Если ваше приложение использует вход на основе OAuth, ASWebAuthenticationSession —
это рекомендуемый выбор, так как он специально разработан для сценариев аутентификации и
обеспечивает лучший баланс безопасности и пользовательского опыта.
Chrome Custom Tabs (CCT) обеспечивают аутентификацию на базе Chrome внутри вашего приложения:
Ключевые особенности:
Интеграция с OAuth: Chrome Custom Tabs являются эквивалентом ASWebAuthenticationSession на iOS, обеспечивая отличную поддержку OAuth при сохранении доступа к сохраненным ключам доступа.
Embedded WebView предоставляют полный контроль над рендерингом веб-контента в вашем приложении, позволяя напрямую манипулировать cookie, сессиями и навигацией без URL-строки. Однако этот контроль сопряжен с дополнительными техническими требованиями для включения функциональности ключей доступа.
Когда выбирать Embedded WebView:
Важный контекст:
Многие приложения используют гибридный подход: System WebView обрабатывает начальную аутентификацию OAuth (где ключи доступа работают без проблем), а затем переключаются на Embedded WebView для пост-аутентификации, чтобы управлять ключами доступа в настройках. Проблемы возникают при попытке использовать ключи доступа напрямую в Embedded WebView.
Технические требования:
Embedded WebView требуют дополнительной настройки по сравнению с System WebView:
Компоненты платформы:
WKWebViewandroid.webkit.WebViewКомпромиссы:
При реализации ключей доступа через WebView крайне важно понимать разницу между System WebView и Embedded WebView. Три подхода, описанные выше (Нативная реализация, System WebView и Embedded WebView), служат разным целям.
На iOS у вас есть несколько вариантов отображения веб-контента в приложении:
На Android основные варианты:
android.webkit.WebView), который
по сути является мини-браузером, который можно встроить в ваши activities. Он очень
гибко настраивается, но работает в процессе вашего приложения.В следующих разделах мы подробнее рассмотрим эти типы WebView для iOS и Android и обсудим, какой из них может быть наиболее подходящим для потоков аутентификации с ключами доступа.
Платформа Apple предоставляет три варианта WebView, перечисленные выше. Ваш выбор повлияет на то, насколько гладко можно будет использовать ключи доступа внутри приложения:
Для тестирования различного поведения WebView в iOS мы рекомендуем приложение WebView - WKWebView and UIWebView rendering.
WKWebView — это универсальный компонент WebView для iOS. Разработчики могут встроить WKWebView для рендеринга веб-контента с высокой степенью контроля над UI и поведением. WKWebView использует тот же движок рендеринга, что и Safari, поэтому он очень производителен и поддерживает современные веб- функции. Теоретически, WKWebView может обрабатывать WebAuthn (и, следовательно, ключи доступа), если настроен правильно, но учтите, что некоторые расширенные функции браузера могут быть ограничены из соображений безопасности. Одна вещь, на которую стоит обратить внимание, — это то, что WKWebView по умолчанию не делится cookie или данными связки ключей с мобильным Safari. Пользователям может потребоваться заново входить в систему, потому что их сессия в WebView изолирована от сессии Safari. Также, поскольку содержимое WKWebView может быть полностью настроено приложением, пользователь не видит адресной строки или UI Safari — что отлично для брендинга, но это означает, что у пользователя меньше подсказок для проверки подлинности страницы (что является проблемой для защиты от фишинга). Некоторые приложения даже злоупотребляли WKWebView для внедрения скриптов или изменения контента (например, было отмечено, что TikTok внедрял отслеживающий JS через свой встроенный браузер), поэтому нужно быть осторожным и использовать WKWebView безопасным, заслуживающим доверия образом.
SFSafariViewController предоставляет опыт использования Safari внутри приложения. Когда вы открываете URL с помощью SFSafariViewController, это почти как открыть его в настоящем браузере Safari, за исключением того, что пользователь остается в UI вашего приложения. Преимущество для ключей доступа значительно: поскольку это, по сути, Safari, пользователю доступны его iCloud Keychain и сохраненные ключи доступа. Обратите внимание, что на iOS 11+ cookie не являются общими. Это означает, что если у пользователя уже есть ключ доступа для вашего сайта, Safari сможет его найти и даже отобразить автозаполнение Conditional UI для легкого входа. SFSafariViewController менее настраиваемый (вы не можете сильно изменить его панель инструментов), но он автоматически обрабатывает множество функций безопасности и конфиденциальности. Отображается URL-строка с иконкой замка для HTTPS, что дает пользователям уверенность в том, что они находятся на правильном домене. В целом, SFSafariViewController считается более безопасным, чем "сырой" WKWebView, и его проще реализовать (Apple предоставляет его как готовый компонент). Основной компромисс — вы жертвуете некоторым контролем над внешним видом. Для потока аутентификации это обычно приемлемо. Приоритетом здесь является безопасность и простота входа, в чем SFSafariViewController преуспевает, используя контекст Safari.
| WKWebView | SFSafariViewController | |
|---|---|---|
| Пользовательский опыт | - Ощущение нативности: Пользователи могут чувствовать, что веб-контент является нативной частью приложения, так как разработчики могут настроить внешний вид, чтобы он соответствовал дизайну приложения. - Автозаполнение: Возможно автозаполнение данными из Safari | - Бесшовность: Бесшовный пользовательский опыт с использованием настроек Safari пользователя, обеспечивающий единообразный просмотр веба между нативным приложением и браузером. |
| Опыт разработчика | - Высокая настраиваемость: Доступны обширные возможности настройки и конфигурации - Гибкость: Множество API для взаимодействия с веб-контентом | - Средняя настраиваемость: Ограниченные возможности настройки, особенно по сравнению с WKWebView - Простота: Проще в реализации по сравнению с WKWebView |
| Производительность | - Довольно медленно: В зависимости от реализации и веб-контента, скорость загрузки можно оптимизировать, но она все равно может быть ниже по сравнению с SFSafariViewController из-за дополнительной обработки пользовательских функций и взаимодействий. | - Довольно быстро: Обычно предлагает лучшую производительность, так как использует движок Safari, оптимизированный для скорости и эффективности, обеспечивая быструю загрузку веб-страниц. |
| Доверие и узнаваемость | - Отображение URL не требуется: WKWebView часто не показывает URL, что затрудняет проверку веб-страницы пользователями. Потенциальная возможность для вредоносных приложений имитировать это поведение и заниматься фишингом учетных данных. | - Опыт, подобный браузеру: Рендерит веб-страницы с помощью Safari, обеспечивая опыт, "подобный браузеру". Пользователи могут видеть URL и использовать функции автозаполнения Safari, что потенциально внушает больше доверия благодаря знакомому интерфейсу. |
| Изоляция | - Разделено: Cookie и сессии отделены от Safari; пользователи не будут автоматически входить в систему в WKWebView. | - Разделено: Cookie и сессии также отделены от Safari; пользователи не будут автоматически входить в систему и в SFSafariViewController. |
| Уязвимости | - Безопасно: Изначально безопасно благодаря песочнице приложений Apple, но поведение и безопасность зависят от реализации приложения. Возможны уязвимости при неправильной реализации. | - Более безопасно: Пользуется встроенными функциями безопасности Safari, включая защиту от фишинга и предупреждения о вредоносных сайтах. Обычно считается более безопасным для отображения веб-контента, чем WKWebView, благодаря этим функциям и знакомству пользователя с Safari. |
| Прочее | - Функции недоступны: Некоторые функции браузера (например, WebAuthn) могут быть не полностью доступны из-за соображений безопасности и того, что WKWebView работает в контексте приложения. - Внедрение JavaScript: Некоторые приложения, например, TikTok, внедряют отслеживающий JavaScript в свой встроенный WKWebView или ограничивают контроль пользователя (например, Facebook) - Проблемы с конфиденциальностью: Больше отзывов сообщества относительно конфиденциальности | - Нет внедрения JavaScript: Не позволяет выполнение JavaScript из приложения, что повышает безопасность и конфиденциальность. Также не поддерживает JavaScript-оповещения или подтверждения, что потенциально может повлиять на пользовательский опыт на некоторых веб-страницах. - Режим чтения: Предоставляет режим чтения для чистого, легко читаемого варианта статей. |
SFAuthenticationSession / ASWebAuthenticationSession – Эти классы (последний — более новое, дружественное к Swift название) созданы специально для потоков входа, таких как OAuth или OpenID Connect. Когда вам нужно аутентифицировать пользователя через веб-страницу (возможно, у внешнего IdP), эти сессии являются рекомендуемым выбором на iOS. Они очень похожи на SFSafariViewController в том, что используют браузер Safari под капотом и делятся cookie/хранилищем с Safari. Ключевое отличие в том, что SFAuthenticationSession всегда будет запрашивать у пользователя, что приложение хочет аутентифицироваться с помощью веб-страницы (для осведомленности пользователя), и он автоматически будет использовать существующую сессию Safari пользователя, если она доступна.
Преимущество заключается в бесшовном опыте SSO – если пользователь уже вошел в систему у провайдера в Safari, эта сессия может использовать этот cookie, чтобы избежать еще одного входа. Для ключей доступа это важно, потому что это означает, что любой ключ доступа, хранящийся в Safari/iCloud Keychain, также может быть использован здесь. Официальное руководство Apple — использовать ASWebAuthenticationSession для всего, что похоже на поток входа. Плюсы — повышенная конфиденциальность (ваше приложение никогда не видит учетные данные или cookie, Safari обрабатывает это) и встроенная поддержка SSO. Минус в том, что он ограничен потоками аутентификации (вы бы не использовали его просто для рендеринга произвольного веб-контента в вашем приложении). В общем, если вы выбираете подход с WebView на iOS, ASWebAuthenticationSession обычно является лучшим выбором для реализации ключей доступа, потому что он безопасен, делится состоянием с Safari и специально создан для аутентификации.
На Android выбор WebView сводится к классическому WebView и Chrome Custom Tabs:
Для тестирования различного поведения WebView в Android мы рекомендуем приложение WebView vs Chrome Custom Tabs.
Android WebView (android.webkit.WebView) — это компонент, который позволяет встраивать веб-страницы в макет вашего activity. Он похож на WKWebView в том, что дает вам полный контроль: вы можете перехватывать навигацию, внедрять JavaScript, настраивать UI и т.д. Он также работает в процессе вашего приложения. Использование WebView для ключей доступа означает, что ваше приложение загружает вашу веб-страницу входа, и эта страница может инициировать церемонию WebAuthn с ключом доступа. Современный Android WebView поддерживает WebAuthn (при условии, что реализация WebView на устройстве обновлена через Android System WebView или компонент Chrome). Важное соображение: по умолчанию Android WebView не делится cookie или сохраненными учетными данными с браузером Chrome пользователя. Таким образом, любой ключ доступа, созданный или использованный в WebView, может быть неизвестен Chrome, и наоборот. Эта изоляция может быть хороша для безопасности (ваше приложение не может читать cookie браузера), но она может заставить пользователей снова входить в систему, если они уже аутентифицировались в Chrome. Другая проблема — доверие. Обычный WebView не показывает URL или иконку замка SSL, поэтому пользователям приходится полностью доверять вашему приложению, что оно их не обманет. Google даже запретил использование WebView для входа в Google через OAuth из-за потенциальных рисков фишинга. С точки зрения производительности, WebViews в порядке, но они могут быть медленнее или более ресурсоемкими, чем использование браузера пользователя по умолчанию, особенно при загрузке тяжелых страниц.
Chrome Custom Tabs (CCT) — это гибридный подход. Они позволяют вашему приложению открывать страницу, отрендеренную Chrome, которая выглядит как часть вашего приложения. Вы можете настроить цвет панели инструментов, добавить логотип приложения и т.д., но контент рендерится Chrome в отдельном процессе. Для ключей доступа у CCT есть несколько преимуществ: они делятся cookie и учетными данными пользователя с Chrome, что означает, что если у пользователя есть ключ доступа, сохраненный через Chrome (Google Password Manager), Custom Tab может получить к нему доступ. Пользователь также увидит фактический URL и индикаторы безопасности, что укрепляет доверие. Производительность часто лучше — Chrome можно "прогреть" в фоновом режиме для более быстрой загрузки. И что важно, безопасность на высоком уровне: поскольку это, по сути, приложение Chrome, такие вещи, как Google Safe Browsing, защищают сессию, и ваше приложение не может внедрять произвольные скрипты на страницу (предотвращая определенные атаки).
Недостатком является то, что это требует, чтобы у пользователя был установлен и обновлен Chrome (или поддерживаемый браузер). У большинства пользователей Android он есть, но на некоторых устройствах в определенных регионах это может быть проблемой. В целом, если вы выбираете подход с встроенным вебом на Android, Chrome Custom Tabs рекомендуются для потоков с ключами доступа, так как они обеспечивают хороший баланс интеграции и безопасности. Фактически, они во многом аналогичны SFSafariViewController/ASWebAuthSession на iOS — использование браузера по умолчанию для аутентификации.
(Кстати: WKWebView vs SFSafariViewController от Apple и WebView vs CCT от Android имеют много параллелей. И Safari VC, и Chrome Tabs делятся состоянием браузера и обеспечивают лучшую безопасность, в то время как WKWebView/Android WebView дают больше контроля, но изолируют веб-контент. Для ключей доступа обмен состоянием (cookie, хранилища учетных данных) обычно желателен, чтобы к ключу доступа можно было беспрепятственно получить доступ и создать его.)
| Функция | WebView | Chrome Custom Tab | |
|---|---|---|---|
| Пользовательский опыт | - Гибкость: Предоставляет богатый набор API для взаимодействия с веб-контентом и управления взаимодействиями пользователя, включая обработку диалогов JavaScript и запросов разрешений. - Согласованность: Управление согласованным UX, особенно с разнообразным веб-контентом, может быть сложной задачей. | - Функции браузера: Использует общие функции, такие как Экономия трафика и синхронизированное автозаполнение на разных устройствах. - Кнопка "Назад": Позволяет пользователям легко вернуться в приложение с помощью встроенной кнопки "Назад". - Зависимость: Зависит от приложения Chrome, которое может быть недоступно или не обновлено на всех устройствах пользователя. - Перенаправление в браузер: Некоторые функции могут перенаправлять пользователей в приложение Chrome, что потенциально может нарушить пользовательский опыт. - Частичные Custom Tabs: Только часть экрана может быть использована для Chrome Custom Tab, в то время как остальная часть показывает нативное приложение. - Боковая панель: В ландшафтном режиме и на устройствах с большим экраном Chrome Custom Tab отображается только с одной стороны экрана, в то время как остальная часть экрана показывает нативное приложение. | |
| Опыт разработчика | - Высокая настраиваемость: Предлагает широкие возможности/потребности в настройке. - Интерактивность: Предоставляет множество API для взаимодействия с веб-контентом и управления взаимодействиями пользователя. | - Настраиваемость: Позволяет настраивать цвет панели инструментов, кнопку действия, нижнюю панель инструментов, пользовательские пункты меню и анимации входа/выхода. - Callback: Доставляет callback в приложение при внешней навигации. - Функции безопасности: Предоставляет готовые функции, устраняя необходимость управлять запросами, предоставлением разрешений или хранилищами cookie. | |
| Производительность | - Посредственная производительность: Может не предлагать такой же уровень производительности, как Chrome Custom Tabs (CCT). | - Предварительный прогрев: Включает предварительный прогрев браузера в фоновом режиме и спекулятивную загрузку URL для ускорения загрузки страниц. - Приоритет: Предотвращает выгрузку приложений, запускающих Custom Tab, во время его использования, повышая его важность до уровня "foreground". | |
| Доверие и узнаваемость | - URL и SSL не видны: URL и информация SSL по своей природе не видны в WebView. Если разработчик приложения не реализует эти функции, пользователи не будут знать, находятся ли они на правильном веб-сайте или на фишинговом. | - URL и SSL видны: Использует фактический браузер Chrome для рендеринга страниц. Пользователи могут видеть URL и SSL-сертификат (указывающий, является ли соединение безопасным). Это может дать пользователям уверенность, что они не на фишинговом сайте. | |
| Изоляция | - Работает в процессе приложения: Если в приложении есть уязвимость, позволяющая выполнение вредоносного кода, существует риск, что WebView может быть скомпрометирован. Однако WebView также получает обновления, но его поведение и безопасность могут больше зависеть от использующего его приложения. - Нет обмена cookie/сессиями: Не делится cookie или сессиями с основным браузером устройства, обеспечивая изоляцию, но, возможно, требуя от пользователей повторного входа. | - Работает в процессе Chrome: Будучи частью Chrome, Custom Tabs работают в том же процессе и имеют те же обновления безопасности и функции, что и Chrome. - Общее хранилище cookie и модель разрешений: Гарантирует, что пользователям не придется повторно входить на сайты или повторно предоставлять разрешения. - Настройки и предпочтения Chrome: Использует настройки и предпочтения Chrome. | |
| Уязвимости | - Callbacks для кражи учетных данных: Потенциальные уязвимости включают то, что иногда требуется JavaScript, что открывает дверь для других приложений для выполнения вредоносного кода, например, регистрации callbacks, которые пытаются перехватить имена пользователей и пароли. - Фишинг: Кроме того, вредоносное приложение может открыть другую веб-страницу, которая имитирует поток Link в попытке фишинга. | - Google Safe Browsing: Использует Google Safe Browsing для защиты как пользователя, так и устройства от опасных сайтов. - Безопасное оформление браузера: Гарантирует, что пользователь всегда видит точный URL, с которым он взаимодействует, и может просматривать информацию о сертификате веб-сайта, снижая риск фишинга. Кроме того, custom tabs не допускают внедрения JavaScript. | |
| Прочее | - Google запретил WebViews для входа пользователей в аккаунты Google |
Независимо от того, какой подход к реализации вы выберете, для включения функциональности ключей доступа должны быть выполнены определенные технические требования. В этом разделе представлено исчерпывающее руководство по настройке файлов ассоциации well-known, прав iOS и конфигурации Android WebView.
Примечание об управляемых устройствах: Поведение ключей доступа значительно меняется на управляемых устройствах, где политики Mobile Device Management (MDM) контролируют хранение учетных данных. Для тестирования ключей доступа на управляемых устройствах см. Passkeys на управляемых устройствах iOS и Android.
Нативные и Embedded WebView потоки требуют файлы ассоциации для установления криптографического доверия между вашим приложением и веб-доменом. System WebView (ASWebAuthenticationSession) и Chrome Custom Tabs не требуют ассоциации приложения с сайтом.
Файл AASA устанавливает связь между вашим приложением iOS и вашим веб-доменом, позволяя ключам доступа работать на обеих платформах.
Расположение файла: https://yourdomain.com/.well-known/apple-app-site-association
Требования к конфигурации:
/.well-known/apple-app-site-association на вашем доменеapplication/json.well-knownПример файла AASA:
{ "webcredentials": { "apps": ["TEAMID123.com.example.app"] } }
Кэширование и тестирование AASA:
Apple агрессивно кэширует файлы AASA (до 24-48 часов) с помощью CDN, что может затруднить разработку и тестирование. Чтобы обойти кэширование во время разработки:
?mode=developer к вашему ассоциированному домену в Xcode⚠️ Важно: НЕ используйте ?mode=developer в производственных релизах. Этот параметр
предназначен только для разработки — его использование в продакшене помешает iOS правильно
обнаружить ваш файл AASA, что нарушит функциональность ключей доступа.
Валидация: Используйте Валидатор AASA от Apple для проверки вашей конфигурации.
Android использует Digital Asset Links для проверки связи между вашим приложением и веб-сайтом.
Расположение файла: https://yourdomain.com/.well-known/assetlinks.json
Требования к конфигурации:
/.well-known/assetlinks.json на вашем доменеapplication/jsonПример файла 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" ] } } ]
Валидация: Используйте Генератор Digital Asset Links от Google для создания и проверки вашей конфигурации.
Приложениям iOS требуются соответствующие права для доступа к функциональности ключей доступа. Требования немного различаются в зависимости от вашего подхода к реализации.
Файл прав (часто называемый Runner.entitlements в приложениях на
Flutter или YourApp.entitlements в нативных проектах
iOS) определяет специальные разрешения и возможности, предоставляемые системой Apple. Для
ключей доступа этот файл настраивает Associated Domains.
Расположение файла: Обычно в вашем проекте Xcode по адресу
ios/Runner/Runner.entitlements
Нативная реализация и Embedded WebView требуют возможности Associated Domains для связывания вашего приложения с вашим веб-доменом. System WebView (ASWebAuthenticationSession) не требует этого, так как работает в контексте Safari.
Настройка в Xcode:
webcredentials:Пример конфигурации:
<?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:yourdomain.com</string> <string>webcredentials:subdomain.yourdomain.com</string> </array> </dict> </plist>
| Подход | Требуются Associated Domains | Дополнительная конфигурация |
|---|---|---|
| Нативная реализация | Да | Выделенная реализация |
| System WebView | Не требуются | Работает стандартная веб-настройка |
| Embedded WebView | Да | Требуется конфигурация AndroidX WebKit 1.12.1+ |
Несколько доменов: Если вашему приложению нужно работать с несколькими доменами, вам могут понадобиться Related Origin Requests (ROR).
Android Embedded WebView получили нативную поддержку WebAuthn с AndroidX WebKit 1.12, что устранило необходимость в пользовательском коде JavaScript-моста. System WebView (Chrome Custom Tabs) не требует никакой конфигурации — учетные данные работают автоматически.
Требования:
Реализация:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Проверка поддержки веб-аутентификации if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Включение веб-аутентификации WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Включение JavaScript webView.settings.javaScriptEnabled = true }
Ключевые моменты:
WebViewFeature.WEB_AUTHENTICATION
во время выполненияmediation:"conditional" (автозаполнение полей
ввода ключами доступа) не работает в Embedded WebViewПримечания к версиям:
До AndroidX WebKit 1.12.0 нативной поддержки WebAuthn в Embedded WebView не существовало. Командам приходилось либо:
Если вам нужно поддерживать старые версии Android или устройства без обновленных APK WebView, см. руководство по интеграции Credential Manager с WebView от Android для подхода с кодом моста. Однако, мы настоятельно рекомендуем использовать нативный подход с WebKit 1.12.1+ для современных приложений.
Рекомендация: Используйте нативную поддержку WebAuthn с AndroidX WebKit 1.12.1+. Если она недоступна во время выполнения, переключайтесь на Chrome Custom Tabs, которые обеспечивают отличную поддержку ключей доступа с общими учетными данными.
При реализации ключей доступа в нативных приложениях вам необходимо установить доверие между вашим приложением и веб-доменом(ами). В этом разделе рассматривается, как обрабатывать одиночные домены, несколько связанных доменов (ROR) и как проверять правильность настройки ваших файлов ассоциации well-known.
Для приложений, использующих один домен (например, kayak.com), вам понадобятся:
webcredentials:kayak.comRelated Origins (ROR) — это
функция WebAuthn, которая позволяет одному набору ключей доступа работать на нескольких
связанных доменах (например, kayak.com, kayak.de, kayak.co.uk).
ROR использует эндпоинт
/.well-known/webauthn на каждом сайте для определения
связанных источников, а НЕ файлы
AASA или assetlinks.
Ключевые моменты:
/.well-known/webauthn со списком
связанных источниковПример конфигурации:
Если ваше приложение работает с kayak.com и kayak.de, оба домена должны:
Перед запуском проверьте, что ваши файлы well-known правильно настроены и доступны. Apple и Google предоставляют тестовые URL на базе CDN для проверки доступности файлов:
| Домен | Проверка Apple AASA | Проверка Google Digital Asset Links |
|---|---|---|
| kayak.com | Тестировать файл AASA Проверьте, может ли CDN Apple получить ваш файл | Тестировать assetlinks.json Проверьте, может ли Google получить доступ к вашим asset links |
| kayak.de | Тестировать файл AASA Проверьте, может ли CDN Apple получить ваш файл | Тестировать assetlinks.json Проверьте, может ли Google получить доступ к вашим asset links |
Использование этих тестовых URL:
?nocache=1 принудительно загружает свежую версию, обходя кэш CDNkayak.com или kayak.de на ваши собственные домены в приведенных выше
шаблонах URLПодводный камень при тестировании: Убедитесь, что все домены имеют правильно настроенные файлы well-known. Отсутствующий или неправильно настроенный файл на любом домене может нарушить функциональность ключей доступа для этого домена.
Дополнительная информация: WebAuthn Relying Party ID в нативных приложениях
Выбор правильного подхода к реализации зависит от архитектуры аутентификации вашего приложения, требований к OAuth и необходимости контроля сессии. Используйте это дерево решений, чтобы определить лучший путь вперед.
Начните с этих ключевых вопросов:
Использует ли ваше приложение аутентификацию на основе OAuth (OAuth2, OIDC, провайдеры входа через соцсети)?
ASWebAuthenticationSessionХотите ли вы повторно использовать веб-аутентификацию в нативной оболочке (без URL-строки, полный контроль над UI)?
WKWebView + права Associated DomainsWebView + конфигурация AndroidX WebKit 1.12.1+Создаете ли вы новое нативное приложение или у вас есть нативные экраны входа?
У вас есть существующая веб-аутентификация, которую вы хотите повторно использовать?
Вот как каждый подход показывает себя по ключевым аспектам:
| Подход | Создание Passkeys | Использование Passkeys | Управление Passkeys | Техническая сложность | Поддержка OAuth | Время настройки |
|---|---|---|---|---|---|---|
| Нативная реализация | Высокое принятие Бесшовная биометрия, лучший UX | Мгновенно, бесшумноpreferImmediatelyAvailableCredentials включает автоматический оверлей при запуске приложения | Полный нативный контроль Интеграция с настройками приложения | Средняя-Высокая Специфичные для платформы API | Требует отдельной реализации потока OAuth | Недели-месяцы |
| System WebView | Хорошее принятие Опыт как в браузере, знакомо | Стандартный UX браузера Conditional UI в полях ввода, общая связка ключей | На базе браузера Пользователи управляют через браузер | Низкая Минимальный нативный код | Отличная Создано для OAuth | Дни-недели |
| Embedded WebView | Низкое принятие Требует конфигурации | Нативная поддержка WebAuthn WebKit 1.12.1+, нет Conditional UI | Ограниченный контроль Нет нативной интеграции | Средняя-Высокая Конфигурация WebView + разрешения | Требует конфигурации | 1-2 недели |
Объяснение аспектов:
Рекомендация: System WebView
Если ваше приложение аутентифицируется через OAuth2, OIDC или провайдеров входа через соцсети (Google, GitHub, Microsoft и т.д.), System WebView является оптимальным выбором:
ASWebAuthenticationSession специально создан для потоков OAuthПример: Приложения для путешествий, такие как kayak.com и kayak.de используют OAuth для аутентификации. System WebView позволяет им поддерживать существующую инфраструктуру OAuth, добавляя поддержку ключей доступа через свои страницы веб-аутентификации.
Рекомендация: Гибридный подход
Используйте System WebView для начальной аутентификации OAuth, затем Embedded WebView для пост-аутентификационных сессий:
Когда использовать: Приложения, которые аутентифицируются через OAuth, но затем должны отображать аутентифицированный веб-контент, где требуется прямая манипуляция сессией.
Рекомендация: Нативная реализация
Создаете с нуля или у вас есть нативные экраны? Выбирайте полностью нативный подход:
preferImmediatelyAvailableCredentials для
отображения
автоматического оверлея с ключами доступа при запуске приложения
— эксклюзивно для нативных реализаций и обеспечивает самые высокие
коэффициенты конверсииДля новых приложений: Настоятельно рекомендуем создавать нативный вход с первого дня. Это обеспечит оптимальный UX и позволит избежать будущих миграций с WebView на нативную реализацию.
Рекомендация: Поэтапная миграция
Этот поэтапный подход позволяет постепенно вносить улучшения, не нарушая работу существующих пользователей.
| Требование | Нативная | System WebView | Embedded WebView |
|---|---|---|---|
| Файлы Well-known (AASA/assetlinks) | Требуются | Не требуются | Требуются |
| iOS Associated Domains | Требуются | Не требуются | Требуются |
| Библиотека Android WebKit | Неприменимо | Не требуется | Требуется (1.12.1+) |
| Relying Party ID | Должен совпадать с доменом | Должен совпадать с доменом | Должен совпадать с доменом |
Подробные инструкции по настройке см. в Разделе 5.
Тестирование ключей доступа в нативных приложениях требует структурированного, многоуровневого подхода. Следуйте пирамиде тестирования: модульные тесты (изолированная логика), интеграционные тесты (церемония WebAuthn на симуляторах/эмуляторах) и системные тесты (сквозные на физических устройствах).
Основные категории тестов:
Для получения исчерпывающего руководства по тестированию, включая стратегии автоматизации, специфичные для платформ подводные камни и полный предстартовый чек-лист, см. наше специальное руководство: Тестирование потоков Passkey в нативных приложениях iOS и Android.
Рассмотрите возможность предлагать пользователям создать ключ доступа после успешного традиционного входа (пароль, OAuth). Такой подход постепенного перехода:
Пример: После входа через OAuth с помощью System WebView покажите нативный запрос: "Включить более быстрый вход с помощью Face ID?" Если пользователь соглашается, создайте ключ доступа через веб-страницу, загруженную в System WebView.
Решение о том, как реализовать ключи доступа — через нативную реализацию, System WebView или Embedded WebView — является ключевым выбором дизайна, который влияет на безопасность, пользовательский опыт и сложность разработки. Универсального ответа не существует.
Для приложений на основе OAuth: System WebView (ASWebAuthenticationSession, Chrome Custom Tabs) является рекомендуемой отправной точкой. Он обеспечивает отличную поддержку OAuth, минимальные усилия по реализации и автоматическое совместное использование учетных данных.
Для приложений native-first: Переходите на нативную реализацию как можно скорее.
Нативный вход с ключом доступа предлагает самый бесшовный UX с эксклюзивными
возможностями, такими как preferImmediatelyAvailableCredentials, который включает
автоматический оверлей с ключами доступа при запуске приложения
— то, чего не могут предоставить реализации с WebView. С первоклассной поддержкой ключей
доступа в iOS и Android, реальные успехи демонстрируют высокое внедрение. Инструментарий
(включая SDK с открытым исходным кодом и библиотеки платформ) созрел, чтобы сделать
нативную интеграцию достижимой в разумные сроки. Хотя вы должны помнить о политиках
управления устройствами, межплатформенной синхронизации и сторонних провайдерах, эти
проблемы можно решить с помощью тщательной инженерии и тестирования. Результатом является
вход в приложение, который радует пользователей своей простотой и скоростью, значительно
повышая безопасность.
Для требований к встроенному фрейму WebView: Embedded WebView обычно используется в двух реальных сценариях. Во-первых, приложения на основе OAuth часто используют System WebView для начального потока входа, а затем переключаются на Embedded WebView для отображения опций управления ключами доступа на экранах настроек, где требуется контроль сессии, хотя некоторые приложения упрощают это, используя System WebView для обоих потоков. Во-вторых, приложения, которые уже встроили свой поток аутентификации во фреймы WebView до принятия ключей доступа, продолжают этот паттерн для согласованности. Embedded WebView с нативной поддержкой WebAuthn (AndroidX WebKit 1.12.1+) требует конфигурации и настройки (разрешения, права, настройки WebView), но больше не нуждается в пользовательском коде JavaScript-моста. Обратите внимание, что Conditional UI не поддерживается в Embedded WebView. Выбирайте этот подход, когда поддерживаете существующие встроенные паттерны аутентификации или когда вам нужен контроль сессии/cookie для экранов после аутентификации.
В конечном итоге, ключи доступа в нативных приложениях представляют собой огромный скачок вперед как в удобстве для пользователя, так и в безопасности. Независимо от того, реализованы ли они через нативную реализацию, System WebView или Embedded WebView, они устраняют риски фишинга и бремя управления паролями для ваших пользователей. Реальные внедрения, такие как интеграция ключей доступа в нативное приложение VicRoads, демонстрируют, что подходы native-first обеспечивают самое высокое внедрение и удовлетворенность пользователей при правильном выполнении с такими функциями, как автоматические оверлеи с ключами доступа. Следуя лучшим практикам для удобной аутентификации и выбирая подход к реализации, который соответствует архитектуре вашего приложения — native-first для новых приложений, System WebView для потоков OAuth или Embedded WebView для существующих встроенных паттернов — вы можете предложить беспарольный, биометрический вход, который действительно реализует видение ключей доступа: простая, безопасная и приятная аутентификация для всех.
Если ключи доступа не работают в вашем нативном приложении, проверьте эти распространенные проблемы в зависимости от подхода к реализации:
application/json.well-knownhttps://your-domain.com (а не app://)webcredentials:yourdomain.comASWebAuthenticationSession (рекомендуется) или
SFSafariViewController?mode=developer во время разработки (удалите для продакшена)WebViewFeature.WEB_AUTHENTICATIONsetWebAuthenticationSupport() вызван с
WEB_AUTHENTICATION_SUPPORT_FOR_APP"NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport()Не появляется запрос на использование ключа доступа
?mode=developer на iOS для
тестирования, проверить тип WebViewДля детальной отладки см. нашу статью о Relying Party ID в нативных приложениях.
Нативные SDK от Corbado:
Документация платформ:
Инструменты для валидации:
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