本页由自动翻译生成。请阅读英文原文 此处.
| 方法 | 采用率 | 创建通行密钥 | 使用通行密钥 | 管理通行密钥 | 技术复杂度 | OAuth 支持 |
|---|---|---|---|---|---|---|
| 原生实现 | 🟢🟢🟢 | 高采用率,最佳用户体验,无缝生物特征识别 | 即时、静默身份验证 | 完全原生控制 | 中到高 | 需要单独实现流程 |
| 系统 WebView | 🟢🟢 | 良好采用率,类似浏览器的体验 | 标准浏览器用户体验,共享钥匙串 | 基于浏览器的管理 | 低 | 极佳 |
| 嵌入式 WebView | 🟢 | 较低采用率,需要更多设置 | 原生支持 iOS 和 Android(WebKit 1.12.1+),无 Conditional UI | 有限的控制 | 中到高 | 不适用 |
注意: 通常会将系统 WebView 和嵌入式 WebView 结合使用,其中系统 WebView 处理登录(具有自动凭据共享功能),然后嵌入式 WebView 在设置中呈现通行密钥管理。
关键决策因素:
现代移动平台提供了三种不同的方法将通行密钥集成到您的原生应用中,每种方法在用户体验、技术复杂度和 OAuth 兼容性方面都有不同的权衡:
原生实现:使用平台 API(iOS AuthenticationServices、Android Credential Manager)直接在应用的 UI 中构建通行密钥流程。通过无缝的生物特征验证提供最佳的用户体验,但需要中等至较高的技术实施工作量。
系统 WebView:使用平台的浏览器组件(iOS ASWebAuthenticationSession / SFSafariViewController、Android Chrome Custom Tabs)来处理身份验证。非常适合基于 OAuth 的登录流程,并与系统浏览器共享凭据。
嵌入式 WebView:在您的应用中嵌入一个可自定义的 Web 视图(iOS WKWebView、Android WebView),以在原生应用骨架中重用 Web 身份验证。提供类似原生的外观,没有 URL 栏,并完全控制 Web 视图 UI。需要额外的设置,包括权限和授权 (iOS),以及在 Android 上使用 AndroidX WebKit 1.12.1+ 配置 WebView 以启用通行密钥功能。
正确的选择取决于您的应用的身份验证架构、您是否使用 OAuth 提供商、您需要对 UI 有多大的控制权,以及您是在构建原生优先应用还是在重用 Web 组件。
原生通行密钥实现提供最佳的用户体验,使用平台特定的 API 直接在应用的 UI 中构建身份验证流程。用户受益于平台原生的对话框、无缝的生物特征验证和最快的登录速度。
何时选择原生实现:
preferImmediatelyAvailableCredentials
在通行密钥可用时自动显示通行密钥覆盖层,从而提供最快的登录体验,而无需输入标识符关键优势:preferImmediatelyAvailableCredentials()
原生实现可以利用 preferImmediatelyAvailableCredentials()
在通行密钥可用时,立即在应用启动时创建一个自动通行密钥覆盖层。这种无用户名的流程提供了最快的登录体验——用户无需先输入标识符即可立即看到他们的通行密钥。此功能是原生实现独有的,不可在 WebView 变体中使用。
下图说明了与 WebView 的 Conditional UI 方法相比,原生身份验证如何提供更快的用户旅程:
原生的自动覆盖层提供了更优越的用户体验和更高的通行密钥使用率,因为在应用启动时即刻开始身份验证,而 WebView 实现则要求用户首先与输入字段交互。
技术要求概述:
原生通行密钥集成需要您的应用和 Web 域之间的加密信任。如果没有它,操作系统将拒绝所有 WebAuthn 操作。主要要求:
/.well-known/ 的应用-域关联文件主要好处:在您的网站上创建的通行密钥可以在您的应用中无缝使用,反之亦然。
在 iOS 上原生实现通行密钥涉及 Apple 的 AuthenticationServices 框架,该框架提供了用于 WebAuthn 操作的 API:
关键组件:
ASAuthorizationController:管理身份验证流程ASAuthorizationPlatformPublicKeyCredentialProvider:创建通行密钥请求开发提示
?mode=developer 以强制获取最新内容Android 的原生通行密钥实现使用 Credential Manager API(或者旧的 FIDO2 API 以保持向后兼容):
关键组件:
CredentialManager:所有凭据操作的核心 APICreatePublicKeyCredentialRequest:用于通行密钥注册GetCredentialRequest:用于通行密钥身份验证注意:Android 原生应用目前缺乏 iOS 在键盘上的 Conditional UI 建议(尽管 Conditional UI 在 Web 应用中有效)
原生实现通行密钥有重大的挑战和经验教训:在操作系统层面进行集成可能会暴露跨不同设备和操作系统版本的问题。
虽然您可以使用原始平台 API 实现通行密钥,但专用 SDK 可以通过处理 WebAuthn 的复杂性、边缘情况并提供内置遥测功能,显著加快开发速度。SDK 还提供用于单元测试的模拟接口(这很关键,因为您无法在模拟器中测试生物特征)。
建议: 对于原生实现,我们建议使用 Corbado SDK(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 使用实际的系统浏览器(iOS 上的 Safari,Android 上的 Chrome)显示 Web 内容,维护共享的 cookie、保存的凭据和熟悉的浏览器安全指示器。
何时选择系统 WebView:
关键优势:
平台组件:
ASWebAuthenticationSession(推荐用于身份验证流程)或
SFSafariViewController(常规浏览)像 Google 和 GitHub 这样的主要公司采用了这种方法,通过在其现有 Web 身份验证页面的 WebView 覆盖层,将通行密钥登录添加到他们的移动应用中。当完全原生的身份验证重构不能立即进行时,这种方法效果很好。
iOS 提供两个主要的系统 WebView 组件用于身份验证:
企业 Passkey 白皮书. 面向 passkey 项目的实用指南、推广模式和 KPI。
ASWebAuthenticationSession(推荐用于身份验证):
SFSafariViewController(常规浏览):
| 功能 | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| 主要用例 | 身份验证流程 | 常规 Web 浏览 |
| OAuth/OIDC | 极佳 | 良好 |
| 通行密钥支持 | 是 | 是 |
| 自定义 | 有限 | 极少 |
如果您的应用使用基于 OAuth 的登录,ASWebAuthenticationSession
是推荐的选择,因为它是专门为身份验证场景设计的,并且在安全性和用户体验之间提供了最佳平衡。
Chrome Custom Tabs (CCT) 在您的应用内提供由 Chrome 驱动的身份验证体验:
主要功能:
OAuth 集成:Chrome Custom Tabs 是相当于 iOS ASWebAuthenticationSession 的 Android 版本,提供出色的 OAuth 支持,同时保持对存储通行密钥的访问。
在实时 demo 中试用 passkeys。
嵌入式 WebView 提供对在您的应用中呈现 Web 内容的完全控制,允许直接操作 cookie、会话和导航,且没有 URL 栏。然而,这种控制带来了额外的技术要求,以启用通行密钥功能。
何时选择嵌入式 WebView:
重要背景:
许多应用采用混合方法:系统 WebView 处理初始的 OAuth 身份验证(通行密钥在其中无缝工作),然后切换到嵌入式 WebView 进行身份验证后的操作以在设置中管理通行密钥。当尝试直接在嵌入式 WebView 中使用通行密钥时,挑战就会出现。
技术要求:
与系统 WebView 相比,嵌入式 WebView 需要额外的设置:
平台组件:
WKWebViewandroid.webkit.WebView权衡:
通过 WebView 实现通行密钥时,理解系统 WebView 和嵌入式 WebView 之间的区别至关重要。上面概述的三种方法(原生实现、系统 WebView 和嵌入式 WebView)分别服务于不同的用例。
在 iOS 上,您有多个选项用于在应用内显示 Web 内容:
在 Android 上,主要选择是:
android.webkit.WebView),它本质上是一个可以嵌入在您的活动 (Activities) 中的迷你浏览器。它高度可定制,但在您的应用进程中运行。在接下来的章节中,我们将更深入地探讨 iOS 和 Android 的这些 WebView 类型,并讨论哪一种最适合通行密钥身份验证流程。
订阅我们的 Passkeys Substack,获取最新消息。
Apple 的平台提供了上面列出的三种 WebView 选项。您的选择将影响应用内通行密钥的使用流畅度:
为了测试 iOS 中不同的 WebView 行为,我们推荐该应用 WebView - WKWebView and UIWebView rendering。
WKWebView 是 iOS 的多功能 WebView 组件。开发人员可以嵌入 WKWebView 来呈现具有对 UI 和行为的高度控制权的 Web 内容。WKWebView 使用与 Safari 相同的渲染引擎,因此性能非常好并支持现代 Web 功能。从理论上讲,如果配置正确,WKWebView 可以处理 WebAuthn(从而处理通行密钥),但请注意,出于安全考虑,某些高级浏览器功能可能会受到限制。需要注意的一点是,默认情况下 WKWebView 不与 Mobile Safari 共享 cookie 或钥匙串数据。用户可能需要重新登录,因为他们的 WebView 会话与 Safari 的会话是隔离的。此外,因为应用可以完全自定义 WKWebView 的内容,用户不会看到地址栏或 Safari UI——这对于品牌推广来说非常棒,但这意味着用户验证页面合法性的线索减少了(对网络钓鱼的担忧)。有些应用甚至滥用 WKWebView 注入脚本或更改内容(例如,有人指出 TikTok 通过其应用内浏览器注入跟踪 JS),因此在使用 WKWebView 时务必要谨慎以确保安全且值得用户信任。
SFSafariViewController 提供了应用内的 Safari 体验。当您使用 SFSafariViewController 打开 URL 时,它几乎就像在真正的 Safari 浏览器中打开它一样,只是用户停留在您应用的 UI 中。这对于通行密钥的优势是巨大的:因为它本质上就是 Safari,所以可以访问用户的 iCloud 钥匙串和保存的通行密钥。请注意,cookie 在 iOS 11+ 上是不共享的。这意味着如果用户已经拥有您网站的通行密钥,Safari 可以找到它,甚至可以显示 Conditional UI 自动完成功能以便于登录。SFSafariViewController 的可定制性较差(您不能过多更改其工具栏),但它会自动处理大量安全和隐私功能。显示了 URL 栏以及 HTTPS 的挂锁图标,这让用户确信他们在正确的域上。通常,SFSafariViewController 被认为比原始 WKWebView 更安全,并且实现起来更简单(Apple 将其作为一个拖放组件提供)。主要的权衡是您牺牲了对外观和感觉的一些控制。对于身份验证流程,这通常是可以接受的。此处的优先级是安全性和登录便利性,SFSafariViewController 通过使用 Safari 的上下文在这些方面表现出色。
| WKWebView | SFSafariViewController | |
|---|---|---|
| 用户体验 | - 原生感觉: 用户可能会觉得 Web 内容是应用原生的一部分,因为开发人员可以自定义外观和感觉以匹配应用的设计。 - 自动填充: 可以使用来自 Safari 的数据进行自动填充 | - 无缝: 使用用户的 Safari 设置的无缝用户体验,确保原生应用和浏览器之间的 Web 浏览一致。 |
| 开发人员体验 | - 高度可定制: 提供广泛的定制和配置 - 灵活: 许多用于与 Web 内容交互的 API | - 中度定制: 定制选项有限,尤其是与 WKWebView 相比, - 简单: 与 WKWebView 相比更易于实现 |
| 性能 | - 较慢: 取决于实现和 Web 内容,可以优化加载速度,但由于需要额外处理自定义功能和交互,可能仍然比 SFSafariViewController 慢。 | - 较快: 通常提供更好的性能,因为它利用了为速度和效率而优化的 Safari 引擎,为网页提供快速加载时间。 |
| 信任和识别 | - 不要求显示 URL: WKWebView 通常不显示 URL,这使得用户更难验证网页。恶意应用有可能模仿这种行为并钓鱼凭据。 | - 类似浏览器的体验: 使用 Safari 呈现网页,提供“类似浏览器”的体验。用户可以看到 URL 并访问 Safari 的自动填充功能,熟悉的界面可能会灌输更多的信任。 |
| 隔离 | - 分离: cookie 和会话与 Safari 分离;用户将不会自动登录到 WKWebView 中。 | - 分离: cookie 和会话与 Safari 分离;用户也不会自动登录到 SFSafariViewController 中。 |
| 漏洞 | - 安全: 归功于 Apple 的应用沙盒机制而固有安全,但行为和安全取决于应用的实现。如果实现不正确,可能会出现漏洞。 | - 更安全: 受益于 Safari 内置的安全功能,包括防网络钓鱼和恶意网站警告。由于这些功能和用户对 Safari 的熟悉度,通常认为其用于显示 Web 内容比 WKWebView 更安全。 |
| 其它 | - 功能不可用: 由于安全问题和 WKWebView 运行在应用上下文中,一些浏览器功能(例如,WebAuthn)可能无法完全访问。 - JavaScript 注入: 某些应用(例如 TikTok)将跟踪 JavaScript 注入其应用内 WKWebView,或限制用户控制(例如 Facebook) - 隐私问题: 有关隐私的社区反馈较多 | - 无 JavaScript 注入: 不允许执行来自应用的 JavaScript,增强了安全性和隐私。并且它不支持 JavaScript 警报或确认,可能会影响某些网页上的用户体验。 - 阅读器模式:提供阅读器模式以获得文章的清晰、易于阅读的版本。 |
SFAuthenticationSession / ASWebAuthenticationSession – 这些类(后者是较新的更加 Swift 友好的名称)专门用于登录流程,例如 OAuth 或 OpenID Connect。当您需要通过网页验证用户(可能是对外部 IdP)时,这些会话是 iOS 上的首选。它们与 SFSafariViewController 非常相似,都在底层使用 Safari 浏览器,并与 Safari 共享 cookie/存储区。关键区别在于 SFAuthenticationSession 将始终提示用户,该应用想要使用网页进行身份验证(为了让用户知情),并且如果可用,它将自动使用用户现有的 Safari 会话。
其好处是无缝的 SSO 体验——如果用户已经在 Safari 中的提供商那里登录,此会话可以使用该 cookie 以避免再次登录。对于通行密钥而言,这一点很重要,因为这意味着此处也可以使用任何存储在 Safari/iCloud 钥匙串中的通行密钥凭据。Apple 的官方指南是建议对于任何看起来像登录流程的操作使用 ASWebAuthenticationSession。优点是增强的隐私保护(您的应用永远看不到凭据或 cookie,由 Safari 处理)以及内置的 SSO 支持。缺点是它仅限于身份验证流程(您不会用它来仅仅在您的应用中呈现任意 Web 内容)。总而言之,如果您在 iOS 上选择 WebView 方法,ASWebAuthenticationSession 通常是实现通行密钥的最佳选择,因为它安全、与 Safari 共享状态并且是专为身份验证构建的。
查看实际有多少人在使用 passkeys。
在 Android 上,关于 WebView 的决定在于经典 WebView 和 Chrome Custom Tabs 之间:
为了测试 Android 中不同的 WebView 行为,我们推荐该应用 WebView vs Chrome Custom Tabs。
Android WebView (android.webkit.WebView) 是一个允许您在活动布局中嵌入网页的组件。它与 WKWebView 相似,赋予您完全控制权:您可以拦截导航、注入 JavaScript、自定义 UI 等。它也在您的应用进程中运行。将 WebView 用于通行密钥意味着您的应用加载您的 Web 登录页面,而该页面可以发起 WebAuthn 通行密钥验证。现代 Android WebView 确实支持 WebAuthn(前提是设备的 WebView 实现已通过 Android System WebView 或 Chrome 组件更新)。一个主要的考虑因素:默认情况下,Android WebView 不与用户的 Chrome 浏览器共享 cookie 或存储的凭据。因此,在 WebView 中创建或使用的任何通行密钥可能都不为 Chrome 所知,反之亦然。这种隔离对安全性有好处(您的应用无法读取浏览器 cookie),但这可能会迫使用户在 Chrome 中已经完成身份验证的情况下再次登录。另一个问题是信任。一个普通的 WebView 不会显示 URL 或 SSL 锁图标,因此用户必须完全信任您的应用不会进行网络钓鱼。出于潜在的网络钓鱼风险,Google 甚至已禁止使用 WebView 进行 Google OAuth 登录。性能方面,WebView 不错,但可能会比使用用户默认浏览器更慢或消耗更多内存,特别是在加载重型页面时。
Chrome Custom Tabs (CCT) 是一种混合方法。它们允许您的应用打开由 Chrome 呈现的页面,使其看起来就像是您应用的一部分。您可以定制工具栏颜色,添加应用标识等,但内容在独立的进程中由 Chrome 渲染。对于通行密钥,CCT 有几点好处:它们与 Chrome 共享用户的 cookie 和凭据,这意味着如果用户已经通过 Chrome 存储了通行密钥(Google 密码管理器),Custom Tab 就能访问它。用户还能看见真实的 URL 和安全指示,这建立了信任。性能通常更好——Chrome 可以在后台“预热”以便更快地加载。最重要的是,安全性强:由于它本质上就是 Chrome 应用,像 Google Safe Browsing 这样的功能保护了会话,而且您的应用不能将任意脚本注入到页面中(防止某些攻击)。
缺点是它要求用户已安装并更新了 Chrome(或支持的浏览器)。大多数 Android 用户都有,但在某些地区某些设备上,这可能是个问题。总体而言,如果您在 Android 上采用嵌入式 Web 方案,推荐为通行密钥流程使用 Chrome Custom Tabs,因为它们提供了整合与安全性之间的良好平衡。事实上,在很多方面,它们类似于 iOS 的 SFSafariViewController/ASWebAuthSession——利用默认浏览器进行身份验证。
(旁注:Apple 的 WKWebView 对应 SFSafariViewController 以及 Android 的 WebView 对应 CCT 之间有许多相似之处。Safari VC 和 Chrome Tabs 共享浏览器状态并提供更好的安全性,而 WKWebView/Android WebView 提供更多控制权但隔离了 Web 内容。对于通行密钥,共享状态(cookie、凭据存储)通常是人们所希望的,以确保能无缝地访问和创建通行密钥。)
| 功能 | WebView | Chrome Custom Tab |
|---|---|---|
| 用户体验 | - 灵活性: 提供了丰富的用于与 Web 内容交互和管理用户交互的 API 集,包括处理 JavaScript 对话框和权限请求。 - 一致性: 管理一致的 UX 可能具有挑战性,特别是对于多样化的 Web 内容。 | - 浏览器功能: 共享跨设备的数据保护和同步自动完成等功能。 - 返回按钮: 允许用户通过集成的返回按钮轻松返回应用程序。 - 依赖性: 依赖于 Chrome 应用,可能并非所有用户设备上均已安装或更新 - 重定向至浏览器: 某些功能可能会将用户重定向至 Chrome 应用,从而可能破坏用户体验。 - 部分 Custom Tabs: 屏幕的仅一部分可用于 Chrome Custom Tab,其余部分显示原生应用程序 - 侧面板: 在横向模式和大屏幕设备上,Chrome Custom Tab 仅显示在屏幕的一侧,其余屏幕显示原生应用程序 |
| 开发人员体验 | - 高度可定制: 提供广泛的定制选项/需求。 - 交互性: 提供了大量 API 来与 Web 内容进行交互并管理用户交互。 | - 可定制: 允许定制工具栏颜色、操作按钮、底部工具栏、自定义菜单项以及进出动画。 - 回调: 外部导航时向应用程序传递回调。 - 安全特性: 提供开箱即用的功能,无需管理请求、权限授予或 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 运行在同一个进程,并且拥有与 Chrome 相同的安全更新和功能。 - 共享的 Cookie 容器和权限模型: 保证了用户无需重新登录站点,也无需重新授予权限。 - Chrome 设置和偏好: 运用 Chrome 的设置和偏好选项。 |
| 漏洞 | - 回调凭证窃取: 潜在漏洞在于某些时候需要使用 JavaScript,这导致了其他应用执行恶意代码,例如注册回调尝试拦截用户名和密码。 - 网络钓鱼: 此外,恶意应用还能打开另一个模仿链接流程的网页实施网络钓鱼。 | - Google Safe Browsing: 借助 Google 的 Safe Browsing 功能保护用户和设备,防范危险站点。 - 安全的浏览器装饰: 确保用户始终看到他们交互的确切 URL,且能够查看网站的证书信息,从而减少网络钓鱼的威胁。另外,Custom Tabs 禁止注入 JavaScript。 |
| 其它 | - Google 封禁 WebView: 禁止使用 WebView 登录 Google 账户。 |
无论您选择哪种实现方法,都必须满足特定的技术要求以启用通行密钥功能。本节提供有关配置众所周知的关联文件、iOS 授权和 Android WebView 配置的全面指南。
有关受管设备的注意事项: 在移动设备管理 (MDM) 策略控制凭据存储的受管设备上,通行密钥行为发生显着变化。有关在受管设备上测试通行密钥的信息,请参阅“在受管 iOS 和 Android 设备上的通行密钥”。
原生和嵌入式 WebView 流程需要关联文件,在您的应用和 Web 域之间建立加密信任。系统 WebView (ASWebAuthenticationSession) 和 Chrome Custom Tabs 不需要应用到站点的关联。
AASA 文件建立您的 iOS 应用和 Web 域之间的连接,使通行密钥可以跨两个平台工作。
文件位置: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 使用 CDN 积极缓存 AASA 文件(长达 24-48 小时),这可能会给开发和测试带来麻烦。在开发期间为了绕过缓存:
?mode=developer⚠️ 重要提示:不要在正式发布版本中使用
?mode=developer。此参数仅供开发使用——在生产环境中使用它将阻止 iOS 正常检测您的 AASA 文件,从而破坏通行密钥功能。
验证:使用 Apple 的 AASA 验证器验证您的配置。
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" ] } } ]
验证:使用 Google 的 Digital Asset Links 生成器创建并验证您的配置。
iOS 应用需要正确的授权 (Entitlements) 以访问通行密钥功能。根据您的实施方法不同,其需求稍有差别。
授权文件(在 Flutter 应用中通常命名为
Runner.entitlements 或者在原生 iOS 项目中命名为
YourApp.entitlements)定义了由 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 | 否 | 默认的 Web 机制即可生效 |
| 嵌入式 WebView | 是 | 要求 AndroidX WebKit 1.12.1+ 的配置 |
多个域:如果您的应用需涉及多个域进行工作,您可能需要借助相关源请求 (Related Origin Requests, ROR)。
Android 嵌入式 WebView 支持通过两种截然不同的方式来实现通行密钥:基于 WebKit 的较新方式(5.3.1节)以及旧版的 JavaScript 桥接方式(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"(输入框里的通行密钥自动填入功能)无法生效版本注记:
在 AndroidX WebKit 1.12.0 发布之前,嵌入式 WebView 中并不存在原生的 WebAuthn 支持机制。这种传统的策略须使用一套自建的由 Web 层向 Native 层进行通信桥接的设计手法,用来应对那些仍缺失了原生 WebView WebAuthn 处理能力的终端设备的通行密钥验证问题。
官方样例:
适用场景:必须兼顾兼容较旧层级的 Android 系统平台或者是采用旧款 WebView 方案设备的那些场景。
研发团队须从下面择一操作:
要获取深入实施操作详述资料,务请细览 Android's Credential Manager WebView Integration guide。可是,在当前最新款型的应用软件开发里,我们强烈推崇采纳基于 AndroidX WebKit 1.12.1+ 所主导的具有原生属性的新途径作为开发准线。
推荐:使用带有 AndroidX WebKit 1.12.1+ 的原生 WebAuthn 支持。如果在运行时不可用,则回退到提供出色的共享凭据通行密钥支持的 Chrome Custom Tabs。
在原生应用中落地实施有关通行密钥验证的时候,构建起你的应用以及 Web 域间充分可被确认且相互能够保障信任的工作基石十分紧要。本节内容涉及怎样具体掌控单一作用域场景的问题应对法则,还有处置拥有众多相联系站点的复杂境况所需用到的相关源操作(ROR)。不仅如此,这里还将一并解答您如何验证您的“众所周知 (well-known)”关联配置文件的确得到精准部署并正稳健发挥功效的问题。
当应用程序仅依存于单一个独立域名运转的情况时(如: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 给出各自用于依托 CDN 网路的有效测算核验链接 URL 方法用来核定文件能不能访问:
| 域 | Apple AASA 验证 | Google Digital Asset Links 验证 |
|---|---|---|
| kayak.com | Test AASA file 检查 Apple CDN 是否可取得您的文件 | Test assetlinks.json 校验 Google 能否存取您的 asset links |
| kayak.de | Test AASA file 检查 Apple CDN 是否可取得您的文件 | Test assetlinks.json 校验 Google 能否存取您的 asset links |
使用这些测试 URL:
?nocache=1
设置条件可直接指令强制提取其最新的一份记录信息内容进而避开原有可能从内容传送分配器 CDN 内产生阻碍的存储内容kayak.com 或 kayak.de 更换为您自身的网域名称测试陷阱:确保所有域都具有正确配置的众所周知的文件。任何一个域中丢失的或配置错误的文件都会破坏该域的通行密钥功能。
更多信息:原生应用中的 WebAuthn 依赖方 ID
选择正确的实现方式依赖于你自身应用的架构、OAuth 条件及处理需求以及到底需要多大量的对当前通信状态会话的把握管控权能因素影响。依靠下面的这个抉择判断逻辑图,将给您引航,找到最为合用的那一条路径。
以下的判定参考流程结构旨在指引您如何依照属于您本身的应用架构特性所需及条件限定,从而选取一种能够贴合所期望要求的方法手段:
每条路径的快速参考:
这是各种手段于至关要紧评判准则上的优劣展示评析表单:
| 方法 | 创建通行密钥 | 使用通行密钥 | 管理通行密钥 | 技术复杂度 | OAuth 支持 | 设置时间 |
|---|---|---|---|---|---|---|
| 原生实现 | 高采用率 无缝的生物特征识别,绝佳的体验感受 | 即时,完全静默preferImmediatelyAvailableCredentials 支持程序一开始工作呈现重叠引导显示界面 | 全盘管控操作 融合于程序设置界面管控环节之内 | 程度属居中-略高 各种限定于各平台的 API 功能指令集 | 需要专门研发搭建分离专用的处理对应途径 OAuth 操作方案 | 周到月 |
| 系统 WebView | 良好采用率 和利用浏览器相似的操作经历,体验感到熟识 | 标准浏览器 UX 针对填充框处的 Conditional UI,可使用相连共享钥匙串互联服务 | 凭附在浏览器实现运作下 倚赖它作治理操控 | 技术成本要求低廉 涉原生代码极低化运作 | 极其卓越拔尖 纯为了用于完成专门指向给 OAuth 处理运作 | 数天到周 |
| 嵌入式 WebView | 偏低的采用水平 需附加安排做些环境准备 | WebAuthn 原生对应层级支撑保障 在 WebKit 1.12.1+ 层面上,可是失去由 Conditional UI 给到的自动完成指引呈现能力 | 较具有限权度的处置控制权 无法深度直接涉入整合运作 | 程度属居中-略高 得进行包含 WebView 的各种设定再配置各种特权准入授权项 | 必须经配置布置方可运行 | 一至两周 |
维度解释:
我们对此给予强力推介的首选方案:系统 WebView
当你的所属研发应用程序依附使用诸如 OAuth2、OIDC 这个级别的通行协定或者是依赖众多现行第三方社交平台诸如(类似 Google,GitHub 或者是 Microsoft 这类)当作实现账户注册凭据服务工具提供厂商渠道进行操作登录功能:
ASWebAuthenticationSession
其为了 OAuth 这一特殊运作准入认证做过极其针对性专业部署实例:旅行应用(例如 kayak.com 和 kayak.de)使用 OAuth 进行身份验证。系统 WebView 允许他们通过其 Web 身份验证页面维护现有的 OAuth 基础架构,同时增加对通行密钥的支持。
我们对此给予强力推介的办法是采取:混合使用方式
初期先依靠着系统的 WebView 的机能用来进行一开始进行的带有附带各种相关信息的验证许可授权机制身份认证机制(OAuth)环节操作运作然后为了处置已经经历完毕顺利证实获准状态以后接手维持掌控接续工作的开展请过渡移交由给由嵌入式 WebView 当做主角负责来接力。
此方案对应能契合起能起到作用产生绝佳契机的场合境遇时机指代包括在什么时候什么特定时间背景节点情况等特定时候被运用进去: 此场景对专门属于被指代拥有那些需要利用依托借助经在已经利用并实施完成关于拥有基于有依靠对于对利用有具有 OAuth 通道身份性质方式认证之后的程序去负责操作验证处理过程后接续仍然有存在需要专门对于已获取准许被允许通过身份验明证身查验许可资格那些特指具有相关信息资料性质特质的资料信息属性的网页呈现内容,以及需要在期间存在一种带有必须且一定要进行某种极度具有直接性质能施予一定强力管治调度手法的能发挥对于操作能够有着主观管控行为能施展发挥干预权限能力的时候。
给予的最佳指导意见:直接奔向拥抱那些彻底采用具有全面原装纯正特性的方案,实行完全以走属于拥有由底层驱动机制所完全提供纯原生手段方式
若是直接开展一切由从最基本的初始基石源头之处直接构筑建立而起的话,或者是本就已经存在着具备那些具有带有直接性关联底层的呈现页界面的情况呢?那么就应该要坚决毫不迟疑彻底放开手脚去完全尽情地全面走上和尽数接纳全情融入纯原生之正道:
preferImmediatelyAvailableCredentials
如此这样一项有着相关作用机能去直接负责呈现带有所谓能够自动运行并可进行提示遮罩覆盖能够展现出通行密钥提示覆盖功能模块面板的这样一种能附带在只要一开始启用了应用程序当刻便即时弹出显示自动出现提示覆盖通行密钥之层功能机制——像如此拥有这般这般极为特殊功效属性那可是绝对能够称得算是专门特意属于只能让在采用进行那些原装性质完全是由彻底在原生底层逻辑实行搭建操作手法方法的情况下,才可以专享特供能去独自占有享受拥有的特属专有的一类福利优待专属权呢!并且能有着绝对可以促使并能带携可以得到拥有能提升达成获取收获拥有极具带有高度极其夸张属于超高级别程度在最终有着那些具有极大比重极大规模转化率层级层面比数之保证喔针对那部分才刚刚出炉属于全新研发的新面市的各类软件和新式应用项目情况方面: 非常严肃及郑重地极其极其建议应该需能够把可以做到直接由在程序运行所依附依靠之源头底层那里入手实施建立构建组建构筑操作去安排实现登录工作相关处理操作行为等相关事项给全部在一开始之第一阶段首当其冲第一天里就把这相关事情通通给全部包办完成做好处理妥妥当当。借由这种这般做法去实施那是直接能使得您去获取可以享受占据占有处于那个可以获取夺得最最顶级绝妙最佳超优级优等能提供极致良好感受有着最优待遇的最顶级用户体验(UX)的绝对最佳位置而且还能够避开在之后在未来往后将不可避免可能会遭遇需要被面对的将会可能发生需要进行去迫使要实行实行要使得那些本属于在本来一直使用那些依赖通过借由属于处在那个由在通过使用那部分是借助是由使用了借助在基于由于使用了通过处于属于是建立构建在其之上之那个处于其上方上面之上属于带有被统称为是由这在那个处于这个被划入那在这是这被叫这是这是这个那这这这个在那那个这个是由它去借助是依赖的 WebView 上进行再往向向处于是在原生性质方向上去进行转变移植挪移改变操作转变移植。
给予最极力强力大力给出的方案及建设性给出之建言之最佳推荐应对处置之策之方法及对策办法:请采用逐步循序渐进逐渐慢慢过渡逐层分段分期分步有计划进行过渡移交方式办法手法手段策略计策谋划方式处理
下面呈现出的这一副图形示意解说图案将具体展现演示讲解出具体实施一步一脚印稳扎稳打一步步递进逐步逐阶段渐进式步步推进展开进行执行落实的整个具有带有着进行迁移过档过渡转移转变移步移动演进发展过程变迁的路径指示脉络指导图:
每一期的实施进程都是紧密搭建奠基于前一个阶层的基础之上作为根基来不断拔高,从而可以允准去进行逐渐积累稳健一点一滴日积月累去渐进缓慢提升实施各种各样的不断一点一滴增加积攒逐步进步的微小改进操作手法而能做到并可以确保丝毫也绝不轻易去对现如今仍在使用仍在当前进行活动现有使用人群造成干扰破坏搅乱带来负面惊扰的不佳情况发生。
| 需求 | 原生 | 系统 WebView | 嵌入式 WebView |
|---|---|---|---|
| 众所周知的文件 (AASA/assetlinks) | 要求 | 不要求 | 要求 |
| iOS Associated Domains | 要求 | 不要求 | 要求 |
| Android WebKit 库 | 不适用 | 不要求 | 要求 (1.12.1+) |
| 依赖方 ID (Relying Party ID) | 必须与域匹配 | 必须与域匹配 | 必须与域匹配 |
参阅第 5 节以了解详情。
在原生应用里实施通行密钥相关的校验验证检测工作必须有赖建立起一套非常有调理有次序多层面复合架构多层次架构具有系统且完备的一套结构完整的方法理论支撑机制体系架构。务必请遵循以下关于测试工作的这个被称为检测理论之金字塔原则的这种被冠名冠以有如一种属于呈阶梯式具备有有着犹如某种某种像这类别类型的在上面犹如呈现有着形同有着这种被有着这样有这种这种像这样这类似如同像那像这是这被那一种被冠以有着犹如有着被称作有着是这那那种种测试这种具有被称为被命名这是那样有有着像金字塔那种式样的这么一种架构层级的有如像被像有有着这是在那样这是那种这样那么有着像这种具备的这种一种被称为叫那这样被称为那种叫有这是:单元测试(unit tests)(那些属于是针对只在隔绝在单一独立状态中处于封闭单独脱离状态中的局部具体运作功能运作之隔离部分的单独孤立状态的运作指令逻辑的封闭检测环节)、集成测试(integration tests)(那涉及在有关于需要需涵盖囊括起在关于对于处在需要在处在包含在涵盖于对涉及处在于有着处于是在要关于需要涵盖在属于存在于需要去应对进行模拟处在于需进行处理有关于存在需要涵盖需要针对在有需进行对于有包含需涉及在模拟的环境或仿真环境中需进行执行的有关关于需涉及进行实行之 WebAuthn 验证等整个的一套整个的各种一整套仪式的有关整体验证测试动作)以及系统层级之全方位总括验证整体运作功能运转综合统筹全通盘系统级别层级统揽系统连结运作全面系统级端至端全面测试(system tests)(针对处在于有着需要在拥有存在能够需要在关于处于那存在于关于那处于在实际现实拥有具备物理实体实际存有真实质地的实实在在具体实在真实物理环境实体物理设备现实硬件实机身上由一端到另一端彻底地贯通首尾端至端完全彻底到底端对端验证整个操作流程运作测试过程检验过程运作运作流程的全面全过程首尾接通顺畅度检验)。
不容错失必备关键主要不可或缺要紧不能忽略之绝对必要肯定必不可少肯定必须的各样各项核心核心类别分类必查主要要紧核查校验验证检测核心测验核验必要测试项目:
要获取关于包含有实施去构建实行构建建立各种在包含进行搭建建立去进行对于构建执行落实自动化自动运行方式对策有关种种实施方案去关于自动去进行制定落实自动规划实施自动化建立战略种种自动化建立策略,包含囊括应对各种在各自不同的那在专属于那各类种各类各种不同属于各种那不同那有着在各种那不同种拥有不同各类平台各种具有存在属于在各有着在针对各样专属那各平台平台上拥有的各带有其独有专有那各异的独有的会遇上存在会发生存在发生的各类那各自会发生的会遇到的隐藏那些难以发现会在各种会遇到有有着会有发生那容易发生会在各种那容易掉入在有着存在那些坑在容易发生有有在有会在这在那些平台那些各种会存在容易犯错在有有关于种种那那会有陷阱各各各那些陷阱那些各种特殊会踩各种坑陷阱平台特定的一些容易踩坑容易踩中在会容易存在那有容易遇到有有在这那些有会有关于在这在那些有在这个在关于有各种特殊会踩的坑在这方面有在会有发生坑陷阱还有就是附送一份涵盖完整齐备彻底完整包罗所有的各种在事先进行在进行事前事在实施实行在进行在执行实行在在事在一开始最起初在一开始之前一开始先事前事前先事先一开始事前事在最最初先事先一开始就事前在去在实施事前开始实施操作在飞之前最先事先一开始事前进行事先实施的最先第一步前第一步一开始最先前第一先首先在事前先在实施在此前进行事前先在事前实施进行事先先最开始一开始的第一在此最先在这个这先在准备出发起飞在进入在进入到准备飞在开始在这个开始最起首准备进入实施之前准备之准备最先最起首最开始准备进行正式执行准备进行之前的那需要准备的在这在此之前在进入在这在开始那那那在这个这个在这在开始那在事先前实施之前事前事前实施之前起飞前在正式起飞前事前起飞前要在实施这起飞事前起飞之前在最先在这实施在事前飞行最前事前需在要起飞前的在起飞前的在飞行前在实行起飞前实施准备最最开始准备去检查在这起飞的各项要起飞前要在准备进行在这在事先需进行这最在这在飞行起飞前的事在起飞之前需要准备的事在要在正式起跑之前在准备起跑那最在正式准备发车起跑发车前那事最在这那在此事先那那事先起步那最在去最开始准备开始在最先第一那最初要在事先起先首先最要在去在这首先那去在这个在要在事先之前首先那需要这先在事前要在起之前的那最初起先在最先事前最初在之前那在最早以前在最先开始之前的需要去最先去要在事先在之前要先需要在之前事前在进行前所需事前在事前要在事前先在这个最初最前最起先去做的在这个需要那先这要在事先事前先在在在在在的事前起先最初在这个事先准备要在事前事前要在这事前起飞在这事前事要事前需要在此事需事在在这个要在在这个这在这个要在事在这要在事前要在事要在事前前事需在这在这在事在这事前在需事前这在这事这在事在这事前在这要在需事要事要事需事在这个要在需事前在此之前事前事前事前在在这事要需事要在这是要在准备就绪之前在这准备在这个需要事先起飞之前的在这个需要在这是这这是一个需要在之前要在这是这就是在要在事前先事事前去这在要在事前要在事前要在事前需要事这这在要在事前在这个要要在在这要在事在事前要需事在这要事前在这个在这事先需事要在要在事前事在要在事前前要在这个要事要在要在要在事前事前需要在这个这这在事前事在要在在这事需事事在在这个在事前在这个在这个在这事事前要在事先进行排查在这需要事先在飞行前在事前起飞事前事前起飞前在准备起飞前起飞前的事前起飞前的整个大全套清单在内的各样方方面面非常有着极其详尽提供极为细致的方方面面全部内容的一整套具备具备极其详尽指导的全面指南指引性质的各种指引有关详细各种相关提供全套完善细节指引指南详细极其详尽包含极其完整有着最详尽极详尽指南:在原生 iOS 与 Android 应用中测试通行密钥流程。
考虑在用户成功进行传统的登录(密码、OAuth)之后,提示用户创建通行密钥。这种循序渐进的转换方法:
示例:通过系统 WebView 进行 OAuth 登录后,显示原生提示:“使用面容 ID 启用更快的登录?” 如果接受,则通过系统 WebView 加载的网页创建通行密钥。
决定如何实施通行密钥(通过原生实施、系统 WebView 或嵌入式 WebView)是一项至关重要的设计选择,它会影响安全性、用户体验和开发复杂性。没有一种放之四海而皆准的答案。
对于基于 OAuth 的应用:系统 WebView(ASWebAuthenticationSession、Chrome Custom Tabs)是建议的起点。它提供出色的 OAuth 支持、最小的实施工作量和自动共享凭证。
对于原生优先的应用:越早原生化越好。原生通行密钥登录可提供最无缝的用户体验,并具有独家功能,如
preferImmediatelyAvailableCredentials,它可实现应用启动时的自动通行密钥覆盖——这是 WebView 实施无法提供的。随着 iOS 和 Android 现在为通行密钥提供一流的支持,实际的成功证明了其高采用率。工具(包括开源 SDK 和平台库)已经成熟,可以在合理的时间内完成原生集成。虽然您必须注意设备管理策略、跨设备同步和第三方提供商,但可以通过精心的工程设计和测试来管理这些挑战。结果是,应用登录以其轻松和快速让用户感到愉悦,同时显着提高了安全性。
对于嵌入式 WebView 框架要求:嵌入式 WebView 通常用于两种实际场景。首先,基于 OAuth 的应用通常使用系统 WebView 进行初始登录流程,然后切换到嵌入式 WebView 在需要会话控制的设置屏幕中呈现通行密钥管理选项——尽管有些应用通过对两个流程保持使用系统 WebView 来简化此过程。其次,在采用通行密钥之前就已将身份验证流程嵌入 WebView 框架中的应用将继续这种模式以保持一致性。具有原生 WebAuthn 支持的嵌入式 WebView (AndroidX WebKit 1.12.1+) 需要配置和设置(权限、授权、WebView 设置),但不再需要自定义 JavaScript 桥接代码。请注意,嵌入式 WebView 不支持 Conditional UI。当维护现有嵌入式身份验证模式或身份验证后屏幕需要会话/cookie 控制时,请选择此方法。
最终,原生应用中的通行密钥在用户便利性和安全性方面代表着巨大的飞跃。无论通过原生、系统 WebView 还是嵌入式 WebView 实施,它们都消除了用户的网络钓鱼风险和密码管理负担。像 VicRoads 的原生应用通行密钥集成等实际实施表明,当结合使用自动通行密钥覆盖等功能时,原生优先方法可提供最高的用户采用率和满意度。遵循用户友好型身份验证的最佳实践,并选择与应用架构匹配的实施方法(新应用的原生优先、OAuth 流程的系统 WebView 或现有嵌入式模式的嵌入式 WebView),您可以提供无密码的生物识别登录,从而真正实现通行密钥的愿景:为每个人提供简单、安全且令人愉悦的身份验证。
如果通行密钥在您的原生应用中不起作用,请根据实施方法检查以下常见问题:
application/json.well-known 路径上无重定向https://your-domain.com(而不是 app://)webcredentials:yourdomain.com 启用 Associated Domains 功能ASWebAuthenticationSession(推荐)或 SFSafariViewController?mode=developer 进行测试(在生产环境中将其删除)WebViewFeature.WEB_AUTHENTICATION 的运行时功能检查WEB_AUTHENTICATION_SUPPORT_FOR_APP 调用
setWebAuthenticationSupport()"NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport()
调用没有显示通行密钥提示
?mode=developer 进行测试,验证 WebView 类型有关详细的调试,请参阅我们有关原生应用中的依赖方 ID (Relying Party IDs) 的文章。
一个常见的陷阱:具有受限访问权限(IP 白名单、仅限 VPN)的暂存环境将失败,因为 Apple 和 Google CDN 必须能够获取您的关联文件。
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具有生产 rpID 的暂存子域:
如果您的暂存环境(例如,stg.login.example.com)使用生产域作为 rpID(例如,example.com),AASA 查找将发生在
rpID 域,而不是您的暂存子域。这意味着:
示例(多个环境共享一个 AASA):
{ "webcredentials": { "apps": [ "TEAMID123.com.example.app", "TEAMID123.com.example.app.dev", "TEAMID123.com.example.app.stg", "TEAMID123.com.example.app.pre" ] } }
建议: 使用与其暂存域匹配的单独暂存 rpID,以避免在环境之间发生凭证重叠。这要求暂存域上有可公开访问的 AASA 文件。
?mode=developer 澄清说明:
关联域 (Associated Domains) 中的 ?mode=developer
参数绕过 Apple 的 CDN 缓存,但不会绕过可访问性要求。您的 AASA 文件仍必须可从设备中访问(不是通过 Apple 的 CDN,而是直接访问)。这在开发迭代 AASA 更改时有所帮助,但如果您的暂存服务器列入了 IP 白名单,这也没有任何帮助。
Corbado 原生 SDK:
平台文档:
验证工具:
Corbado 是面向大规模运行 consumer 身份验证的 CIAM 团队的Passkey Intelligence Platform。我们让你看到 IDP 日志和通用 analytics 工具看不到的内容:哪些设备、操作系统版本、浏览器和 credential manager 支持 passkey,为什么注册没有转化为登录,WebAuthn 流程在哪里失败,以及什么时候操作系统或浏览器更新会悄悄破坏登录 — 而且无需替换 Okta、Auth0、Ping、Cognito 或你自有的 IDP。两款产品:Corbado Observe 提供 针对 passkey 及任何其他登录方式的 observability。Corbado Connect 提供 内置 analytics 的 managed passkey(与你的 IDP 并存)。VicRoads 通过 Corbado 为 500 万以上用户运行 passkey(passkey 激活率 +80%)。 与 Passkey 专家交谈 →
选择取决于您的身份验证架构。如果您的应用使用 OAuth2 或 OIDC,系统 WebView(iOS 上的 ASWebAuthenticationSession 或 Android 上的 Chrome Custom Tabs)实现的开发工作量最小,且无需设置关联文件。对于全新的原生优先应用,原生实现能提供卓越的用户体验;而嵌入式 WebView 则适合那些已经将身份验证嵌入到 WebView 框架中,并需要在登录后控制会话或 cookie 的应用。
SFSafariViewController 利用 Safari 的引擎,显示带有 SSL 指示器的 URL 栏,并提供网络钓鱼保护,使其在身份验证流程中更值得信赖。WKWebView 提供更多的 UI 定制,但其 cookie 存储与 Safari 隔离,需要 Associated Domains 权限和 AASA 文件来启用通行密钥,并且不显示 URL 栏,这降低了用户的信任信号。
Chrome Custom Tabs 会与用户的 Chrome 浏览器共享 cookie 和存储的凭据,这意味着在身份验证期间可以访问保存在 Google 密码管理器中的通行密钥。标准 Android WebView 具有隔离的 cookie 存储,不显示 URL 或 SSL 指示器,且由于存在网络钓鱼风险,Google 已明确禁止使用它进行 Google 帐户登录。
如果用户将 1Password 等第三方凭据管理器设置为其活动提供程序,它通常会拦截通行密钥的创建和存储,其优先级高于平台的原生凭据管理器(iCloud 钥匙串或 Google 密码管理器)。这意味着通行密钥可能存储在第三方应用而不是平台钥匙串中,从而影响跨设备同步和通行密钥管理行为。
当 MDM 策略禁用凭据同步时,通行密钥将绑定到设备,并且无法漫游到替换设备,这与典型的消费者场景不同。针对企业环境的应用应该规划后备的身份验证机制(例如密码或魔术链接登录),以处理用户收到新受管设备的情况。
相关文章
目录