大多数浏览器和
Developer App 均支持流媒体播放。
-
利用通行密钥升级和凭证管理器简化登录体验
了解如何将基于密码的现有账户自动升级为使用通行密钥。我们将介绍提升账户安全性并简化登录体验的重要意义和实现途径、适用于凭证管理器 App 的新功能,以及如何将你的 App 信息充分整合到新的“密码”App 中。
章节
- 0:00 - Introduction
- 0:38 - Automatic passkey upgrades
- 2:37 - The passkey journey
- 4:18 - Automatic passkey upgrade sequence
- 7:46 - Shipping and deploying passkey support
- 9:17 - Improvements for credential managers
- 10:14 - The new Passwords app!
- 11:30 - Updating appearance in the Passwords app
- 12:31 - One-tap verification code setup
资源
- About the security of passkeys
- ASCredentialProviderExtensionCapabilities
- Authentication Services
- Connecting to a service with passkeys
- Forum: Privacy & Security
- Passkeys overview
- Public-Private Key Authentication
- Supporting passkeys
相关视频
WWDC23
WWDC22
WWDC21
-
下载
大家好 我叫 Garrett 很高兴为大家介绍 如何在你的 App 和网站中 部署自动通行密钥升级 以及其他几项新的开发成果 这些成果能够提供卓越的登录体验 在这个视频中 我将介绍 如何将现有账户自动升级为通行密钥、
针对凭证管理器推出的几项新功能 以及如何让你的 App 在全新“密码”App 中呈现精美外观
我们先来了解 一项非常令人兴奋的功能 也就是自动通行密钥升级
下面来看个例子 这个例子展示了当今典型的登录体验
首先 填写用户名
然后 填写密码
接下来 等待接收短信
并填写验证码
最后 成功登录
像这样的多步骤登录体验 是网站和 App 提供 更高安全性的常见方式 但这个过程可能缓慢或繁琐
在这种情况下 一些 App 可能会显示某种插页式追加销售 让我知道还有更快的替代方案 那就是使用通行密钥等方法 而这个 App 已采用自动通行密钥升级 系统显示一条通知 提示已创建通行密钥! 没有追加销售屏幕 也没有出现中断 让用户能够顺畅地 享受更轻松、更安全的登录体验 当然 这也适用于你的网站
整个体验经过精心设计 能够尽可能轻松顺畅地过渡到 更强大、更安全的登录方式 返回到这个 App 现在登录过程超快、超简单 只需轻点一下即可完成
并排比较这两个流程时 第一步是一样的
通过一个按钮选择账户
对于传统登录方式 还要再完成几个步骤 但使用通行密钥 无需第 2 步或第 3 步 就已经登录了 另请注意 通行密钥更安全
网络钓鱼和其他形式的凭证窃取攻击 构成了当今互联网上 一些最常见的账户盗用方式
而防范网络钓鱼的最佳方式就是 让账户不具备 任何易受网络钓鱼攻击的因素
要保护新账户 可以采取的有效措施之一是 从一开始就为新账户提供通行密钥 使用通行密钥 不用担心会忘记密码 从而降低了需要重设密码的可能性 只需轻点或点按一下即可登录
有了通行密钥 账户便不容易受到当今我们知道的 网络钓鱼的攻击
但几乎所有现有账户 仅使用易受网络钓鱼攻击的因素 比如密码、短信、电子邮件地址、 推送通知以及具有时效性的验证码
虽然结合使用了多种这些因素 来帮助避免受到攻击 但它们仍有相同的基本漏洞 容易受到网络钓鱼的攻击
现在 行业已开始进入过渡期 正在弃用易受网络钓鱼攻击的登录方式 转而使用能够防范网络钓鱼攻击的 身份验证机制 比如通行密钥
在这个过程中 对于现有账户 第一步是 添加防范网络钓鱼攻击的登录方法 作为备选登录方式
这可以帮助你逐步引入通行密钥 让用户能按照自身节奏逐步采用
目标依然是最终摆脱所有 易受网络钓鱼攻击的身份验证因素 不过 这个视频重点介绍 如何迈出第一步 尽可能确保轻松顺畅的体验 让用户开始使用通行密钥
下面来看看自动 通行密钥升级的时序图 App 向系统发出请求 然后系统决定 当前是否需要创建通行密钥 如果需要 系统会返回新的通行密钥
为了做出这个决定 系统收到请求后 会执行这些操作 首先 系统会进行一系列内部检查 确定目前 创建通行密钥是否合适
其中一些检查包括 设备当前是否已安装 凭证管理器 以及是否支持自动通行密钥升级
设备当前是否已准备好使用通行密钥 例如它是否设有密码 或者 对于针对网页的请求 它会通过检查确保 这是非无痕浏览标签页
如果系统认为请求可以继续 它会将请求传递给可用的凭证管理器 然后 凭证管理器会对请求 应用自己的一组条件 最重要的条件是它是否用于 填写同一账户的用户名和密码 同一账户指的是与要注册的通行密钥 具有相同用户名的账户
如果答案是肯定的 并且满足凭证管理器 设置的任何其他条件 系统会返回一个新的通行密钥 这个通行密钥会传递给 App
如果在这个过程中有任何条件不满足 你会收到错误 这不一定表示哪里出了问题 只是说这一次没有成功创建通行密钥
你可以将自动通行密钥升级 当作一项渐进式增强功能 它无法保证在任何情况下 都能成功注册通行密钥 但当它成功注册后 便能提供丝滑的用户体验 不需要你构建追加销售屏幕 也不会妨碍用户使用你的 App
下面来看个例子 了解一下基于密码的登录流程 这个流程提议创建通行密钥
使用密码登录后 它会检查账户是否有通行密钥 如果没有 则会提议创建一个
目前 许多 App 在登录后不久 会显示某种对话框提供这一升级
而使用自动通行密钥升级 就不再需要这一步 你可以传递一个新的 注册请求样式 也就是 .conditional
如果满足系统和通行密钥管理器的所有先决条件 你会收到一个通行密钥 同时 设备会显示一条通知 提示已创建通行密钥 所有这一切都不会中断 App 中正在进行的工作
如果有任何先决条件未满足 你会收到错误 也不会看到任何 UI
这个时候 你可以选择 显示现有的追加销售对话框 也可以选择下次再试
对于网页也一样 这是一个标准的通行密钥注册流程
在这里 添加 mediation conditional 参数 将这个请求 从模态通行密钥创建更改为 自动升级样式请求
在网页上发出这种样式的请求之前 请务必使用 getClientCapabilities 来检查浏览器是否支持这个请求
行业正在从密码过渡到通行密钥 自动通行密钥升级将加快这一过渡
在你的 App 中和网站上 提供通行密钥支持 就像开发和部署某项功能 包括学习、构建、测试和交付阶段 但通行密钥之旅的独特之处在于 有两个最终目标 简化登录体验和提高账户安全性
提供通行密钥支持 能够大大简化登录过程 但如果仍然可以使用密码登录账户 则意味着账户还是容易受到 网络钓鱼和密码重用攻击
也就是说 最终 需要开始思考如何 消除账户中作为登录选项的 所有易受网络钓鱼攻击的因素
如果你的服务发现某个账户 不再使用密码 则可以考虑弃用密码了
同样 对于使用多因素登录的账户 如今使用的大多数额外因素 也依然容易受到网络钓鱼的攻击 因此 行业正在转向启用通行密钥
提供通行密钥可以让用户更快、 更轻松地登录你的服务 同时提供比当今常见的 多因素登录形式更强大的安全保护
你可能还无法完全弃用密码 但请记住 这是部署通行密钥的最终目标
接下来 我将介绍针对凭证管理器推出的 一些新功能
凭证管理器 可以参与自动通行密钥升级 这是肯定的
它们现在还可以填写 具有时效性的验证码
以及在任意文本字段中填写 用户名、密码或一次性验证码
这些都是现有 凭证管理器 API 的新增功能 要添加对这些功能的支持 可以使用几个适用于Info.plist 的新键 以及匹配的 API 你可以在“认证服务”文档中 查看这些 API
另外 借助凭证提供商扩展机制 现在可以处理密码、通行密钥 和验证码 你现在最多可以选择三个 App 来使用 AutoFill
这些就是 针对凭证管理器的一些改进
最后 我将介绍“密码”App 这是 macOS Sequoia、iOS 18 和 visionOS 2 的一项新功能
在 App 中 你的网站名称和图标将突出显示 彰显独特个性 如果你想更改 网站和 App 的展示方式 可以采用现有的 基于标准的方法来执行这一操作 稍后 我会介绍这些方法
返回到顶层 有一个“Passkeys”部分 其中突出显示了 已采用防范网络钓鱼攻击 登录方式的 App 和网站 还有一个关于验证码的部分 这可让用户非常轻松地 查找和拷贝验证码 就像一个专用的身份验证器 App
在“Security”部分中 “密码”App 会列出脆弱、重复使用 或出现数据泄露问题的已保存密码 如果你采用 well-known URL 来更改密码 “Change Password”按钮 会打开更改密码网页
在 macOS 上 用户可以启用一个菜单栏项目 来快速轻松地访问密码和验证码 还可以轻松地 从其他凭证管理器导入密码 以及导出密码
下面我们通过一个例子 来看看 “密码”App 中的账户是什么样子
这个账户同时设有通行密钥和密码
当针对使用同一用户名的 同一 App 或网站 保存通行密钥和密码时 “密码”App 会将它们 合并为一个条目
如果你的网站已采用 OpenGraph 元数据标准 “密码”App 会针对所有已保存 的账户显示你的网站名称
如果未采用这个标准 “密码”App 会试图找出 你的网站名称 或回退到你的域名
OpenGraph 网页标准 可让你声明关于网站的元数据 方法是在页面的 head 标签中 添加特定的元标签
你应该确保针对所有 页面和子域以及所有用户代理 设置元数据 这样你的网站才能始终正确显示
另外 请仔细检查你的网站 有没有使用高分辨率图标 高分辨率图标在你的账户旁边 会显得非常美观
最后 对于提供具有时限性的 验证码的 App 和网站 除了标准二维码 你还可以提供 otpauth 链接引入 一键式验证码设置体验
这个链接将打开 系统上默认的验证码 App 让你能够在其他设备上 轻松设置验证码 或者直接在当前使用的设备上 设置验证码
另外 如果要显示可用于验证码的 身份验证器 App 列表 可以考虑将“Apple 密码” 添加到列表中
如需了解有关验证码的更多信息 请观看“使用 iCloud Keychain 验证码安全登录”
下面我们来看一些后续步骤 如果你还没有部署通行密钥 现在是时候采取行动了! 它们更快、更轻松 而且比密码安全得多 另外 启用自动升级 可以更轻松地开始这一过渡
更新网站的元数据 在“密码”App 中突显网站的个性
最后 简化验证码设置 以便它适用于 任意设备上的任何凭证管理器
感谢观看 也感谢大家帮助消除网络钓鱼 再见
-
-
0:01 - Offering a passkey upsell
// Offering a passkey upsell func signIn() async throws { let userInfo = try await signInWithPassword() guard !userInfo.hasPasskey else { return } let provider = ASAuthorizationPlatformPublicKeyCredentialProvider( relyingPartyIdentifier: "example.com") guard try offerPasskeyUpsell() else { return } let request = provider.createCredentialRegistrationRequest( challenge: try await fetchChallenge(), name: userInfo.user, userID: userInfo.accountID) do { let passkey = try await authorizationController.performRequest(request) // Save new passkey to the backend } catch { … } }
-
0:02 - Automatic passkey upgrade
// Automatic passkey upgrade func signIn() async throws { let userInfo = try await signInWithPassword() guard !userInfo.hasPasskey else { return } let provider = ASAuthorizationPlatformPublicKeyCredentialProvider( relyingPartyIdentifier: "example.com") let request = provider.createCredentialRegistrationRequest( challenge: try await fetchChallenge(), name: userInfo.user, userID: userInfo.accountID, requestStyle: .conditional) do { let passkey = try await authorizationController.performRequest(request) // Save new passkey to the backend } catch { … } }
-
0:03 - Modal passkey creation (web)
// Modal passkey creation const options = { "publicKey": { "rp": { … }, "user": { "name": userInfo.user, … }, "challenge": …, "pubKeyCredParams": [ … ] }, }; await navigator.credentials.create(options);
-
0:04 - Automatic passkey creation (web)
// Automatic passkey creation let capabilities = await PublicKeyCredential.getClientCapabilities(); if (!capabilities.conditionalCreate) { return; } const options = { "publicKey": { "rp": { … }, "user": { "name": userInfo.user, … }, "challenge": …, "pubKeyCredParams": [ … ] }, "mediation": "conditional" }; await navigator.credentials.create(options);
-
0:05 - New Credential provider Info.plist keys
<dict> <key>NSExtensionAttributes</key> <dict> <key>ASCredentialProviderExtensionCapabilities</key> <dict> <key>ProvidesPasswords</key> <true/> <key>ProvidesPasskeys</key> <true/> <key>SupportsConditionalPasskeyRegistration</key> <true/> <key>ProvidesOneTimeCodes</key> <true/> <key>ProvidesTextToInsert</key> <true/> </dict> </dict> </dict>
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。