Эта страница переведена автоматически. Прочитайте оригинальную версию на английском здесь.
| Подход | Принятие | Создание ключей доступа | Использование ключей доступа | Управление ключами доступа | Техническая сложность | Поддержка OAuth |
|---|---|---|---|---|---|---|
| Нативная реализация | 🟢🟢🟢 | Высокое принятие, лучший UX, бесшовная биометрия | Мгновенная, тихая аутентификация | Полный нативный контроль | От средней до высокой | Требует отдельного процесса |
| Системный WebView | 🟢🟢 | Хорошее принятие, опыт, похожий на браузер | Стандартный браузерный UX, общая связка ключей | Управление через браузер | Низкая | Отличная |
| Встроенный WebView | 🟢 | Более низкое принятие, требует больше настроек | Нативная поддержка iOS и Android (WebKit 1.12.1+), нет Conditional UI | Ограниченный контроль | От средней до высокой | Н/Д |
Примечание: Системный и встроенный WebView часто комбинируются, когда системный WebView обрабатывает вход (с автоматическим обменом учетными данными), а затем встроенный WebView отображает управление ключами доступа в настройках.
Ключевые факторы для принятия решения:
Современные мобильные платформы предоставляют три различных подхода для интеграции ключей доступа в ваше нативное приложение, каждый из которых имеет свои компромиссы в отношении пользовательского опыта, технической сложности и совместимости с OAuth:
Нативная реализация: Встройте процессы использования ключей доступа непосредственно в ваше приложение, используя API платформы (iOS AuthenticationServices, Android Credential Manager). Обеспечивает наилучший пользовательский опыт с бесшовной биометрической аутентификацией, но требует от средних до высоких технических усилий по реализации.
Системный WebView: Используйте браузерный компонент платформы (iOS ASWebAuthenticationSession / SFSafariViewController, Android Chrome Custom Tabs) для обработки аутентификации. Отлично подходит для процессов входа на основе OAuth и делится учетными данными с системным браузером.
Встроенный WebView: Встройте настраиваемый веб-просмотрщик (iOS WKWebView, Android WebView) в ваше приложение, чтобы повторно использовать веб-аутентификацию в нативном каркасе приложения. Обеспечивает внешний вид, близкий к нативному, без адресной строки и полный контроль над пользовательским интерфейсом веб-просмотра. Требует дополнительных настроек, включая разрешения и права (iOS), а также конфигурацию WebView с AndroidX WebKit 1.12.1+ (Android) для активации функциональности ключей доступа.
Правильный выбор зависит от архитектуры аутентификации вашего приложения, использования OAuth-провайдеров, необходимого уровня контроля над UI и от того, создаете ли вы нативное приложение или повторно используете веб-компоненты.
Последние статьи
♟️
Проблемы ключей доступа на «День 2»: 5 рисков после запуска
🔑
Почему безопасная обработка документов важна для современных предприятий?
♟️
Почему даже ваш самый сложный пароль скоро будет взломан
♟️
Повторное использование паролей в Японии: по-прежнему на уровне 84 % [2026]
♟️
Роль ИИ в обнаружении киберугроз
Нативная реализация ключей доступа обеспечивает оптимальный пользовательский опыт, когда процессы аутентификации встроены непосредственно в UI вашего приложения с использованием API платформы. Пользователи получают преимущества в виде диалоговых окон нативной платформы, бесшовной биометрической верификации и максимально быстрого времени входа.
Когда выбирать нативную реализацию:
preferImmediatelyAvailableCredentials для автоматического
отображения оверлея ключей доступа при их наличии, обеспечивая максимально быстрый вход
без необходимости ввода идентификатораКлючевое преимущество: preferImmediatelyAvailableCredentials()
Нативные реализации могут использовать preferImmediatelyAvailableCredentials() для
создания автоматического оверлея ключей доступа, который появляется немедленно при запуске
приложения, если ключи доступа доступны. Этот процесс без имени пользователя обеспечивает
максимально быстрый опыт входа: пользователи видят свои ключи доступа мгновенно, не вводя
сначала идентификатор. Эта возможность эксклюзивна для нативных реализаций и
недоступна в вариантах WebView.
Диаграмма ниже иллюстрирует, как нативная аутентификация обеспечивает более быстрый пользовательский путь по сравнению с подходом Conditional UI в WebView:
Автоматический оверлей нативной реализации обеспечивает превосходный UX с более высокими показателями использования ключей доступа, так как аутентификация начинается сразу после запуска приложения, в то время как реализации WebView требуют от пользователей сначала взаимодействовать с полями ввода.
Обзор технических требований:
Интеграция нативных ключей доступа требует криптографического доверия между вашим приложением и веб-доменом. Без этого ОС отклонит все операции WebAuthn. Ключевые требования:
/.well-known/Главное преимущество: ключи доступа, созданные на вашем сайте, без проблем работают в вашем приложении и наоборот.
Реализация ключей доступа нативным образом в iOS включает фреймворк Apple AuthenticationServices, который предоставляет 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
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case studyСистемные WebView используют нативный браузерный компонент платформы для обработки аутентификации в вашем приложении. В отличие от полностью нативных реализаций, системные WebView отображают веб-контент с использованием фактического системного браузера (Safari на iOS, Chrome на Android), сохраняя общие файлы cookie, сохраненные учетные данные и знакомые индикаторы безопасности браузера.
Когда выбирать системный WebView:
Ключевые преимущества:
Компоненты платформы:
ASWebAuthenticationSession (рекомендуется для процессов аутентификации) или
SFSafariViewController (общий просмотр)Крупные компании, такие как Google и GitHub, приняли этот подход для добавления входа по ключам доступа в свои мобильные приложения с помощью оверлеев WebView на существующих страницах веб-аутентификации. Это хорошо работает, когда полная нативная переделка аутентификации в данный момент неосуществима.
iOS предоставляет два основных компонента системного WebView для аутентификации:
ASWebAuthenticationSession (Рекомендуется для аутентификации):
SFSafariViewController (Общий просмотр):
| Функция | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| Основной сценарий использования | Процессы аутентификации | Общий просмотр веб-страниц |
| OAuth/OIDC | Отлично | Хорошо |
| Поддержка ключей доступа | Да | Да |
| Настройка | Ограничено | Минимально |
Если ваше приложение использует вход на основе OAuth, рекомендуется выбрать
ASWebAuthenticationSession, так как он специально разработан для сценариев
аутентификации и обеспечивает наилучший баланс между безопасностью и пользовательским
опытом.
Chrome Custom Tabs (CCT) предоставляют возможности аутентификации на базе Chrome внутри вашего приложения:
Whitepaper по Passkey для Enterprise. Практические рекомендации, шаблоны внедрения и KPI для программ passkeys.
Ключевые особенности:
Интеграция с OAuth: Chrome Custom Tabs — это эквивалент ASWebAuthenticationSession для Android, обеспечивающий отличную поддержку OAuth при сохранении доступа к сохраненным ключам доступа.
Попробуйте passkeys в live demo.
Встроенные WebView предоставляют полный контроль над рендерингом веб-контента в вашем приложении, позволяя напрямую управлять файлами cookie, сессиями и навигацией без адресной строки. Однако этот контроль сопряжен с дополнительными техническими требованиями для включения функциональности ключей доступа.
Когда выбирать встроенный WebView:
Важный контекст:
Многие приложения используют гибридный подход: системный WebView обрабатывает первоначальную аутентификацию OAuth (где ключи доступа работают без проблем), затем переключаются на встроенный WebView для действий после аутентификации, чтобы управлять ключами доступа в настройках. Проблемы возникают при попытке использовать ключи доступа напрямую во встроенных WebView.
Технические требования:
Встроенные WebView требуют дополнительных настроек по сравнению с системными WebView:
Компоненты платформы:
WKWebViewandroid.webkit.WebViewКомпромиссы:
При реализации ключей доступа через WebView крайне важно понимать разницу между системными WebView и встроенными WebView. Три подхода, описанные выше (Нативная реализация, Системный WebView и Встроенный WebView), служат для разных случаев использования.
На iOS у вас есть несколько вариантов отображения веб-контента внутри приложения:
На Android основными вариантами являются:
android.webkit.WebView), который
по сути представляет собой мини-браузер, который может быть встроен в ваши активности.
Он легко настраивается, но работает в процессе вашего приложения.В следующих разделах мы немного глубже погрузимся в эти типы WebView для iOS и Android и обсудим, какие из них лучше всего подходят для процессов аутентификации по ключам доступа.
Подпишитесь на наш Passkeys Substack, чтобы получать новости.
Платформа Apple предоставляет три варианта WebView, перечисленные выше. Ваш выбор повлияет на то, насколько плавно можно будет использовать ключи доступа внутри приложения:
Для тестирования различного поведения WebView в iOS мы рекомендуем приложение WebView - WKWebView and UIWebView rendering.
WKWebView — это универсальный компонент WebView для iOS. Разработчики могут встроить WKWebView для отображения веб-контента с высокой степенью контроля над UI и поведением. WKWebView использует тот же движок рендеринга, что и Safari, поэтому он очень производителен и поддерживает современные веб-функции. Теоретически, WKWebView может работать с WebAuthn (и, следовательно, с ключами доступа) при правильной настройке, но обратите внимание, что некоторые расширенные функции браузера могут быть ограничены в целях безопасности. Следует иметь в виду, что WKWebView по умолчанию не делится файлами cookie или данными связки ключей с Mobile Safari. Пользователям может потребоваться войти в систему заново, потому что их сеанс WebView изолирован от сеанса Safari. Кроме того, поскольку контент WKWebView может быть полностью настроен приложением, пользователь не видит адресную строку или UI Safari — это отлично для брендинга, но означает, что у пользователя меньше подсказок для проверки подлинности страницы (что вызывает опасения по поводу фишинга). Некоторые приложения даже злоупотребляли WKWebView для внедрения скриптов или изменения контента (например, было замечено, что TikTok внедряет отслеживающий JS через свой встроенный браузер), поэтому необходимо быть осторожным, чтобы использовать WKWebView безопасным и вызывающим доверие у пользователей образом.
SFSafariViewController обеспечивает опыт Safari внутри приложения. Когда вы открываете URL с помощью SFSafariViewController, это почти то же самое, что и открыть его в реальном браузере Safari, за исключением того, что пользователь остается в UI вашего приложения. Преимущество для ключей доступа значительно: поскольку это по сути Safari, пользователю доступны iCloud Keychain и сохраненные ключи доступа. Обратите внимание, что файлы cookie не общие в iOS 11+. Это означает, что если у пользователя уже есть ключ доступа для вашего сайта, Safari может найти его и даже отобразить автозаполнение Conditional UI для простого входа. SFSafariViewController менее настраиваемый (вы не можете сильно изменить его панель инструментов), но он автоматически обрабатывает множество функций безопасности и конфиденциальности. Адресная строка отображается вместе со значком замка для 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 и специально создан для аутентификации.
Посмотрите, сколько людей действительно используют passkeys.
На Android решение о WebView принимается между классическим WebView и Chrome Custom Tabs:
Для тестирования различного поведения WebView на Android мы рекомендуем приложение WebView vs Chrome Custom Tabs.
Android WebView (android.webkit.WebView) — это компонент, который позволяет вам встраивать веб-страницы в макет вашей активности. Он похож на 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 из-за потенциальных рисков фишинга. С точки зрения производительности, WebView работают нормально, но они могут быть медленнее или требовать больше памяти, чем использование браузера пользователя по умолчанию, особенно при загрузке тяжелых страниц.
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 от Apple по сравнению со SFSafariViewController и Android WebView по сравнению с CCT имеют много параллелей. Как 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 для взаимодействия с веб-контентом и управления взаимодействиями с пользователями. | - Настраиваемый: Позволяет настраивать цвет панели инструментов, кнопку действия, нижнюю панель инструментов, пользовательские пункты меню и анимации входа/выхода. - Обратный вызов: Доставляет обратный вызов приложению при внешней навигации. - Функции безопасности: Предоставляет готовые функции, устраняя необходимость управлять запросами, предоставлением разрешений или хранилищами файлов cookie. |
| Производительность | - Посредственная производительность: Может не предлагать тот же уровень производительности, что и Chrome Custom Tabs (CCT) | - Предварительный разогрев: Включает предварительный разогрев браузера в фоновом режиме и спекулятивную загрузку URL для ускорения времени загрузки страницы. - Приоритет: Предотвращает выгрузку приложений, запускающих Custom Tab, во время их использования, повышая их важность до уровня "на переднем плане". |
| Доверие и узнаваемость | - URL и SSL не видны: Информация о URL и SSL по умолчанию не видна в WebView. Если разработчик приложения не реализует эти функции, пользователи не будут знать, находятся ли они на правильном веб-сайте или на фишинговом. | - URL и SSL видны: Использует фактический браузер Chrome для рендеринга страниц. Пользователи могут видеть URL и SSL-сертификат (показывающий, безопасно ли соединение). Это может дать пользователям уверенность в том, что они не на фишинговом сайте. |
| Изоляция | - Работает внутри процесса приложения: Если в приложении есть уязвимость, позволяющая выполнение вредоносного кода, существует риск компрометации WebView. Однако WebView также получает обновления, но его поведение и безопасность могут больше зависеть от приложения, использующего его. - Отсутствие совместного использования файлов cookie / сеансов: Не делится файлами cookie или сеансами с основным браузером устройства, предлагая изоляцию, но, возможно, требуя от пользователей повторного входа. | - Работает внутри процесса Chrome: Будучи частью Chrome, Custom Tabs работают в том же процессе и имеют те же обновления и функции безопасности, что и Chrome. - Общее хранилище файлов cookie и модель разрешений: Гарантирует, что пользователям не придется повторно входить на сайты или повторно предоставлять разрешения. - Настройки и предпочтения Chrome: Использует настройки и предпочтения Chrome. |
| Уязвимости | - Обратные вызовы для кражи учетных данных: Потенциальные уязвимости включают то, что иногда требуется JavaScript, что открывает дверь для выполнения вредоносного кода другими приложениями, например регистрации обратных вызовов, которые пытаются перехватить имена пользователей и пароли. - Фишинг: Кроме того, вредоносное приложение может открыть другую веб-страницу, которая имитирует процесс Link в попытке фишинга. | - Google Safe Browsing: Использует Google Safe Browsing для защиты как пользователя, так и устройства от опасных сайтов. - Безопасное оформление браузера: Гарантирует, что пользователь всегда видит точный URL, с которым он взаимодействует, и может просматривать информацию о сертификате веб-сайта, снижая риск фишинга. Кроме того, Custom Tabs не позволяют внедрение JavaScript. |
| Другое | - Google запретил WebView для входа пользователей в учетные записи Google |
Независимо от того, какой подход к реализации вы выберете, для активации функциональности ключей доступа должны быть выполнены определенные технические требования. В этом разделе представлено подробное руководство по настройке известных файлов ассоциации, прав iOS и конфигурации Android WebView.
Примечание об управляемых устройствах: Поведение ключей доступа значительно меняется на управляемых устройствах, где политики Mobile Device Management (MDM) контролируют хранение учетных данных.
Нативные и встроенные процессы WebView требуют файлов ассоциации для установления криптографического доверия между вашим приложением и веб-доменом. Системный 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 требуются соответствующие права (entitlements) для доступа к функциональности ключей доступа. Требования немного отличаются в зависимости от вашего подхода к реализации.
Файл прав (часто называемый Runner.entitlements в приложениях
Flutter или YourApp.entitlements в нативных проектах
iOS) определяет специальные разрешения и возможности, предоставляемые системой Apple. Для
ключей доступа этот файл настраивает Associated Domains.
Расположение файла: Обычно в вашем проекте Xcode в ios/Runner/Runner.entitlements
Нативная реализация и встроенный WebView требуют возможности Associated Domains для связи вашего приложения с вашим веб-доменом. Системный 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 | Дополнительная конфигурация |
|---|---|---|
| Нативная реализация | Да | Выделенная реализация |
| Системный WebView | Не требуется | Работает стандартная настройка веба |
| Встроенный WebView | Да | Требуется конфигурация AndroidX WebKit 1.12.1+ |
Несколько доменов: Если вашему приложению необходимо работать с несколькими доменами, вам могут понадобиться запросы к связанным источникам (ROR).
Встроенные WebView на Android поддерживают ключи доступа двумя различными способами: более новый подход на основе WebKit (Раздел 5.3.1) и старый подход через JavaScript bridge (Раздел 5.3.2). Системный WebView (Chrome Custom Tabs) не требует никакой настройки — учетные данные работают автоматически.
Android предоставляет официальные примеры WebView для ключей доступа, демонстрирующие оба подхода к реализации.
Современная интеграция WebKit с нативной обработкой ключей доступа. Этот подход обеспечивает нативную поддержку WebAuthn без необходимости создания пользовательского кода моста.
Официальный пример: Webkit WebView MainActivity
Требования:
Реализация:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Check if Web Authentication is supported if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Enable Web Authentication WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Enable JavaScript webView.settings.javaScriptEnabled = true }
Ключевые моменты:
WebViewFeature.WEB_AUTHENTICATION
во время выполненияmediation:"conditional" (автозаполнение ключей
доступа в полях ввода) не работает во встроенном WebViewПримечания к версиям:
До AndroidX WebKit 1.12.0 встроенной поддержки WebAuthn во встроенном WebView не было. В этом старом подходе используется мост Web-to-Native для обработки ключей доступа на устройствах без нативной поддержки WebView WebAuthn.
Официальные примеры:
Когда использовать: Поддержка старых версий Android или устройств с устаревшими реализацияями WebView.
Командам приходилось либо:
Однако мы настоятельно рекомендуем использовать нативный подход WebKit 1.12.1+ для современных приложений.
Рекомендация: Используйте нативную поддержку WebAuthn с AndroidX WebKit 1.12.1+. Если она недоступна во время выполнения, вернитесь к Chrome Custom Tabs, который обеспечивает отличную поддержку ключей доступа с общими учетными данными.
При реализации ключей доступа в нативных приложениях вам необходимо установить доверие между вашим приложением и веб-доменом(ами). В этом разделе рассматривается, как работать с одним доменом, несколькими связанными доменами (ROR) и как проверить правильность настройки ваших известных файлов ассоциации.
Для приложений, использующих один домен (например, kayak.com), вам необходимо:
webcredentials:kayak.comСвязанные источники (ROR) — это функция WebAuthn, которая позволяет единому набору ключей
доступа работать на нескольких связанных доменах (например, kayak.com, kayak.de,
kayak.co.uk). ROR использует
конечную точку /.well-known/webauthn на каждом сайте для определения связанных
источников, а НЕ файлы AASA или assetlinks.
Ключевые моменты:
/.well-known/webauthn со списком связанных источниковПример конфигурации:
Если ваше приложение работает с kayak.com и kayak.de, оба домена должны:
Перед запуском убедитесь, что ваши известные файлы правильно настроены и доступны. Apple и Google предоставляют тестовые URL на базе CDN для проверки доступности файлов:
| Домен | Проверка AASA Apple | Проверка Digital Asset Links Google |
|---|---|---|
| kayak.com | Тестовый файл AASA Проверьте, может ли CDN Apple получить ваш файл | Тестовый assetlinks.json Убедитесь, что Google имеет доступ к вашим ссылкам на активы |
| kayak.de | Тестовый файл AASA Проверьте, может ли CDN Apple получить ваш файл | Тестовый assetlinks.json Убедитесь, что Google имеет доступ к вашим ссылкам на активы |
Использование этих тестовых URL:
?nocache=1 от Apple принудительно выполняет свежее получение, обходя кэш CDNkayak.com или kayak.de на ваш(и) собственный(ые) домен(ы) в шаблонах URL
вышеПодвох тестирования: Убедитесь, что на всех доменах правильно настроены известные файлы. Отсутствующий или неправильно настроенный файл на любом домене может нарушить функциональность ключей доступа для этого домена.
Выбор правильного подхода к реализации зависит от архитектуры аутентификации вашего приложения, требований OAuth и необходимости управления сессиями. Используйте это дерево решений, чтобы определить лучший путь.
Следующая блок-схема поможет вам выбрать правильный подход к реализации на основе требований вашего приложения:
Краткий справочник для каждого пути:
Вот как каждый подход работает по ключевым параметрам:
| Подход | Создание ключей доступа | Использование ключей доступа | Управление ключами доступа | Техническая сложность | Поддержка OAuth | Время на настройку |
|---|---|---|---|---|---|---|
| Нативная реализация | Высокое принятие Бесшовная биометрия, лучший UX | Мгновенно, тихоpreferImmediatelyAvailableCredentials включает автоматический оверлей при запуске приложения | Полный нативный контроль Интеграция с настройками приложения | От средней до высокой Платформенно-специфичные API | Требует отдельной реализации процесса OAuth | От недель до месяцев |
| Системный WebView | Хорошее принятие Опыт, похожий на браузер, знакомый | Стандартный браузерный UX Conditional UI в полях ввода, общая связка ключей | На базе браузера Пользователи управляют через браузер | Низкая Минимальный нативный код | Отлично Специально создано для OAuth | От дней до недель |
| Встроенный WebView | Более низкое принятие Требует настройки | Нативная поддержка WebAuthn WebKit 1.12.1+, нет Conditional UI | Ограниченный контроль Нет нативной интеграции | От средней до высокой Конфигурация WebView + разрешения | Требует настройки | 1-2 недели |
Объяснение параметров:
Рекомендуется: Системный WebView
Если ваше приложение аутентифицируется через OAuth2, OIDC или провайдеров входа через соцсети (Google, GitHub, Microsoft и т. д.), системный WebView — оптимальный выбор:
ASWebAuthenticationSession специально создан для процессов OAuthПример: Приложения для путешествий, такие как kayak.com и kayak.de, используют OAuth для аутентификации. Системный WebView позволяет им поддерживать существующую инфраструктуру OAuth, добавляя при этом поддержку ключей доступа через свои веб-страницы аутентификации.
Рекомендуется: Гибридный подход
Используйте системный WebView для первоначальной аутентификации OAuth, а затем встроенный WebView для сеансов после аутентификации:
Когда использовать: Приложения, которые аутентифицируются через OAuth, но затем нуждаются в отображении аутентифицированного веб-контента, где требуется прямое управление сессией.
Рекомендуется: Нативная реализация
Строите с нуля или имеете нативные экраны? Выбирайте полностью нативный вариант:
preferImmediatelyAvailableCredentials для
отображения автоматического оверлея ключей доступа при запуске приложения — эксклюзивно
для нативных реализаций и обеспечивает самые высокие коэффициенты конверсииДля новых приложений: Настоятельно рекомендуем создавать нативный вход с первого дня. Это настраивает вас на оптимальный UX и позволяет избежать будущих миграций с WebView на нативные компоненты.
Рекомендуется: Поэтапная миграция
Следующая диаграмма показывает поэтапный путь миграции:
Каждая фаза строится на предыдущей, позволяя вносить постепенные улучшения без сбоев для существующих пользователей.
| Требование | Нативный | Системный WebView | Встроенный WebView |
|---|---|---|---|
| Известные файлы (AASA/assetlinks) | Обязательно | Не требуется | Обязательно |
| iOS Associated Domains | Обязательно | Не требуется | Обязательно |
| Библиотека Android WebKit | Не применимо | Не требуется | Обязательно (1.12.1+) |
| Relying Party ID | Должен соответствовать домену | Должен соответствовать домену | Должен соответствовать домену |
Подробные инструкции по настройке см. в Разделе 5.
Тестирование ключей доступа в нативных приложениях требует структурированного, многоуровневого подхода. Следуйте пирамиде тестирования: модульные тесты (изолированная логика), интеграционные тесты (церемония WebAuthn на симуляторах/эмуляторах) и системные тесты (сквозные на физических устройствах).
Основные категории тестов:
Для получения полного руководства по тестированию, включая стратегии автоматизации, подводные камни, специфичные для платформы, и полный контрольный список перед запуском, см. наше специальное руководство: Тестирование процессов работы с ключами доступа в нативных приложениях iOS и Android.
Рассмотрите возможность предложения пользователям создать ключи доступа после успешного традиционного входа (пароль, OAuth). Этот подход постепенной конверсии:
Пример: После входа через OAuth через системный WebView покажите нативную подсказку: "Включить более быстрый вход с Face ID?". В случае согласия создайте ключ доступа через веб-страницу, загруженную в системном WebView.
Решение о том, как реализовать ключи доступа — через нативную реализацию, системный WebView или встроенный WebView, — является важным проектным выбором, который влияет на безопасность, пользовательский опыт и сложность разработки. Здесь нет универсального ответа.
Для приложений на базе OAuth: Системный WebView (ASWebAuthenticationSession, Chrome Custom Tabs) — рекомендуемая отправная точка. Он обеспечивает отличную поддержку OAuth, минимальные усилия по реализации и автоматическое совместное использование учетных данных.
Для нативных приложений: Лучше перейти на нативную реализацию раньше, чем позже.
Нативный вход по ключу доступа предлагает наиболее бесшовный UX с эксклюзивными
возможностями, такими как preferImmediatelyAvailableCredentials, который обеспечивает
автоматический оверлей ключей доступа при запуске приложения — то, что не могут
предоставить реализации WebView. Теперь, когда iOS и Android обеспечивают первоклассную
поддержку ключей доступа, реальные успехи демонстрируют высокое принятие. Инструменты
(включая SDK с открытым исходным кодом и библиотеки платформ) созрели, чтобы сделать
нативную интеграцию достижимой в разумные сроки. Хотя вы должны помнить о политиках
управления устройствами, синхронизации между устройствами и сторонних провайдерах, этими
проблемами можно управлять с помощью тщательной инженерии и тестирования. В результате
получается вход в приложение, который радует пользователей своей простотой и скоростью,
значительно повышая при этом безопасность.
Для требований к кадрам встроенного WebView: Встроенный WebView обычно используется в двух реальных сценариях. Во-первых, приложения на базе OAuth часто используют системный WebView для первоначального процесса входа, а затем переключаются на встроенный WebView для отображения параметров управления ключами доступа на экранах настроек, где требуется контроль сеанса — хотя некоторые приложения упрощают это, оставляя системный WebView для обоих процессов. Во-вторых, приложения, которые уже встроили свой процесс аутентификации во фреймы WebView до принятия ключей доступа, продолжают этот шаблон для единообразия. Встроенный WebView с нативной поддержкой WebAuthn (AndroidX WebKit 1.12.1+) требует конфигурации и настройки (разрешения, права, настройки WebView), но больше не нуждается в пользовательском коде JavaScript bridge. Обратите внимание, что Conditional UI не поддерживается во встроенном WebView. Выбирайте этот подход при поддержании существующих шаблонов встроенной аутентификации или когда вам нужен контроль сеанса/файлов cookie для экранов после аутентификации.
В конечном счете, ключи доступа в нативных приложениях представляют собой огромный скачок вперед как с точки зрения удобства пользователей, так и с точки зрения безопасности. Будь то реализация через нативный, системный WebView или встроенный WebView, они устраняют риски фишинга и бремя управления паролями для ваших пользователей. Реальные реализации демонстрируют, что полностью нативные подходы обеспечивают максимальное принятие и удовлетворенность пользователей при правильном выполнении с такими функциями, как автоматические оверлеи ключей доступа. Следуя передовым практикам для удобной аутентификации пользователей и выбирая подход к реализации, который соответствует архитектуре вашего приложения — полностью нативный для новых приложений, системный WebView для процессов OAuth или встроенный 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 IDs в нативных приложениях.
Распространенная ошибка: staging-среды с ограниченным доступом (белые списки IP, только VPN) будут давать сбой, потому что CDN Apple и Google должны иметь возможность получать ваши файлы ассоциации.
https://app-site-association.cdn-apple.com/a/v1/your-staging-domain.com?nocache=1https://digitalassetlinks.googleapis.com/v1/statements:list/?source.web.site=https://your-staging-domain.com&relation=delegate_permission/common.handle_all_urlsПоддомен Staging с production rpID:
Если ваша staging-среда (например, stg.login.example.com) использует production-домен в
качестве rpID (например, example.com), поиск AASA происходит на домене rpID, а не на
вашем staging-поддомене. Это означает:
Пример (несколько сред делят один AASA):
{ "webcredentials": { "apps": [ "TEAMID123.com.example.app", "TEAMID123.com.example.app.dev", "TEAMID123.com.example.app.stg", "TEAMID123.com.example.app.pre" ] } }
Рекомендация: Используйте отдельный staging rpID, соответствующий вашему staging-домену, чтобы избежать перекрытия учетных данных между средами. Это требует публично доступных файлов AASA на staging-домене.
Пояснение ?mode=developer:
Параметр ?mode=developer в Associated Domains обходит кэш CDN Apple, но не обходит
требование доступности. Ваш файл AASA по-прежнему должен быть доступен с устройства (не
через CDN Apple, а напрямую). Это помогает во время разработки при итерациях над
изменениями AASA, но не поможет, если ваш staging-сервер находится в белом списке IP.
Нативные SDK Corbado:
Документация платформы:
Инструменты валидации:
Corbado — это Passkey Intelligence Platform для CIAM-команд, обеспечивающих аутентификацию пользователей в крупных масштабах. Мы показываем то, что не видят логи IDP и общие инструменты аналитики: какие устройства, версии ОС, браузеры и менеджеры учётных данных поддерживают passkey, почему регистрации не превращаются в логины, где сбоит WebAuthn-поток и когда обновление ОС или браузера тихо ломает вход — всё это без замены Okta, Auth0, Ping, Cognito или вашего собственного IDP. Два продукта: Corbado Observe добавляет наблюдаемость для passkey и любых других способов входа. Corbado Connect даёт managed passkey со встроенной аналитикой (рядом с вашим IDP). VicRoads использует passkey для более чем 5 млн пользователей с Corbado (+80 % активации passkey). Поговорить с экспертом по passkey →
Выбор зависит от архитектуры вашей аутентификации. Если ваше приложение использует OAuth2 или OIDC, системный WebView (ASWebAuthenticationSession на iOS или Chrome Custom Tabs на Android) требует наименьших усилий по реализации и не требует настройки файлов ассоциации. Для новых нативных приложений нативная реализация обеспечивает превосходный UX, тогда как встроенный WebView подходит для приложений, которые уже встраивают аутентификацию во фрейм WebView и нуждаются в контроле сеанса или файлов cookie после входа.
SFSafariViewController использует движок Safari, показывает адресную строку с индикаторами SSL и обеспечивает защиту от фишинга, что делает его более заслуживающим доверия для процессов аутентификации. WKWebView предлагает больше возможностей настройки UI, но имеет изолированное хранилище файлов cookie отдельно от Safari, требует прав Associated Domains и файла AASA для включения ключей доступа, и не отображает адресную строку, что снижает сигналы доверия пользователей.
Chrome Custom Tabs делятся файлами cookie и сохраненными учетными данными с браузером Chrome пользователя, что означает, что ключи доступа, сохраненные в Google Password Manager, доступны во время аутентификации. Стандартный Android WebView имеет изолированное хранилище файлов cookie, не показывает URL или индикаторы SSL, и Google прямо запретил его для входа в учетные записи Google из-за рисков фишинга.
Если у пользователя сторонний менеджер учетных данных, такой как 1Password, установлен в качестве активного провайдера, он часто перехватывает создание и хранение ключей доступа, имея приоритет над нативным менеджером учетных данных платформы (iCloud Keychain или Google Password Manager). Это означает, что ключи доступа могут храниться в стороннем приложении, а не в связке ключей платформы, что влияет на синхронизацию между устройствами и поведение управления ключами доступа.
Когда политики MDM отключают синхронизацию учетных данных, ключи доступа привязываются к устройству и не могут перемещаться на заменяющее устройство, в отличие от типичных потребительских сценариев. Приложения, ориентированные на корпоративные среды, должны планировать резервные механизмы аутентификации, такие как вход по паролю или магической ссылке, чтобы справляться со случаями, когда пользователь получает новое управляемое устройство.
Посмотрите, как Corbado вписывается во внедрение passkeys и текущий стек аутентификации.
Открыть Console
Похожие статьи
Содержание