大多数浏览器和
Developer App 均支持流媒体播放。
-
了解 Web 的面容 ID 和触控 ID
面容 ID 和触控 ID 可在登录时向你提供顺畅的体验,现在 Safari 浏览器有了 Web 验证 API,你可以将其应用于自己的网站上。了解如何将这另一种便捷、安全的登录方式添加到你的网站上。
资源
相关视频
WWDC20
-
下载
(你好 WWDC 2020) 你好 欢迎来到 WWDC (了解 Web 的面容 ID 和触控 ID) 大家好 我是 Jiewen 来自 WebKit 团队 今天我要讲的是 Web 的面容 ID 和触控 ID 本次的讲座尤其适合那些 想给网站添加这个超酷新特性的 Web 开发者 我们直接开始吧 对于手机上一些 app 的用户体验 我个人很喜欢 即使用面容 ID 或触控 ID 来重新登陆 app 下面我用自己最喜欢的 演示 app Shiny 来为你展示 Shiny 是一款你每天都可以用的 app 它展示给你的是一幅美好的图景 第一次登录 Shiny 我需要输入用户名和密码 由于我非常关心安全问题 因此我启用了 Shiny 的双因素认证 在本例中 我需要等待 SMS 第二因素代码再继续登录 一旦我提交了 SMS 2FA 代码 我就登录了 然后我就能看到这只可爱的狗狗 iOS 使用自动填充 可以使登录过程更顺畅 但是即使如此 我仍然需要执行几个步骤 并思考很多 Shiny 的一个政策是 如果在几个小时内一直不活跃 那我就需要重新登录 你会在许多高安全级别的情景中 看到类似的政策 比如登录某一银行 但是这一次 我在登录的时候 我无需经历填写密码 以及 SMA 2FA 等流程 只像这样使用面容 ID 即可 砰 我登录好了 这样既更高效又更安全 本次讲座旨在 将相同的用户体验带入你的网站 我快速概述一下 我点击“登录”按钮 Safari 浏览器提示我进行确认 然后 砰 面容 ID 我登录进去了 下面我们开始讲述 如何将此功能添加到网站 Web 的面容 ID 和触控 ID 由称为 Web 身份验证的标准提供支持 我先简单讨论一下该标准 然后介绍 Apple 平台身份验证器的实现
之后 我会介绍 采用这项出色的新特性所需的基础知识 最后讲一些重要的最佳做法 结束讲座
现在我们谈一谈 Web 身份验证标准 Web 身份验证是 JavaScript API 对你们 Web 开发者而言 可以在 Web 上使用基于公钥的身份验证 该 API 是在公钥密码术之上构建的 并且带来了许多独特的功能
我们从一些高级概念开始 首先 你需要习惯 这个奇怪而又熟悉的概念 即依赖方 本它质上代表你的网站 其次 API 生成并利用 一个 JavaScript 对象 我们称之为公钥凭据 里面包含执行身份验证所需的 所有必要信息
第三 所有私钥均由 名为身份验证器的设备管理 而不是用户的目录管理 身份验证器可以是安全密钥 这个词你可能听说过 或者是我们刚才看见的 iPhone Web 浏览器管理界面 以便用户与身份验证器交互 并将验证器的响应桥接到网站 第四 验证器可以根据需要 通过我们称为证明的过程 加密证明他们的属性
这些概念可能对很多人来说比较陌生 但是本次讲座应该解释 你需要了解的所有内容 以便你在网站开始使用他们 我们来看看你为什么要这么做
首先 Web 身份验证通过公钥加密 提供了强大的身份验证流程 这比密码强大得多 并且不能重复使用或被破坏
但更重要的是 这可以防备网络钓鱼 Safari 浏览器仅允许在其创建的网站中 使用由此 API 创建的公钥凭据 并且凭据永远不能从他们创建的 身份验证器中导出来 这意味着一旦提供了 公钥凭据 用户不可能将其意外泄露给另一方 很酷 是吧? 这就是对 Web 身份验证标准的概述 稍后我将讨论实际 API 现在我们谈谈 Apple 在 Web 身份验证标准下 可以启用面容 ID 和触控 ID的 一些独特功能
像 iPhone 这种身份验证器 我们称为平台身份验证器 因为身份验证器是平台内置的功能 Apple 在身份验证器中构建了 两个重要的属性 如我们所见 第一个是面容 ID 和触控 ID 用来验证用户的身份
第二个是安全隔区 这是一个处理器 用于管理所有的私钥 并保证它们不能离开设备 通过将两者结合起来 使用面容 ID 或触控 ID 进行的每次登录 实质上都是一种多因素身份验证 设备发送回网站的响应包含两个因素 你拥有的东西 iPhone 还有你具有的特征 即生物特征 然后只需轻按一下即可登录 简直太棒了 但是 网站就像银行一样 可以被管控 以强制执行多因素身份验证 存储在响应中的信息可能是不充足的 他们需要制造商提供一些额外的证据 证明设备确实保留了这些不错的属性 你可以使用称为证明的 可选安全功能来执行此操作
这基本上是一种安全的方法 你可以向设备制造商索要证明 即设备是真实的 并且真的具有其声称具有的功能 这对于像我刚才提到的那种特定用例 非常有用
但是 它能通过侵犯用户隐私的方式实现 例如 设备可以被指示 使用单个的、唯一的证明证书 然后唯一证书轻松成为跟踪的媒介 链接整个 Web 上 用户所有已经证明的帐户 Apple 关注用户隐私问题 因此 Apple 建立了自己的证明服务 该服务会为每个凭据生成唯一证书 这样网站将不可以再使用它们跟踪用户 该服务称为 Apple Anonymous Attestation 我们即将推出 有了这些丰富的功能集 Apple 的平台身份验证器真的很棒 现在我们来逐步了解如何在网站中采用它 网站需要使用三种不同的方法 所有方法都是基于保证的 API 首先你应该检查当前设备是否支持此功能 你可以通过调用 PublicKeyCredential.isUserVerifying- PlatformAuthenticatorAvailable 实现 然后 当用户设置使用它时 你需要调用 navigator.credentials.create 来创建一个 PublicKeyCredential 对象 里面包含必要的身份验证信息 最后 当用户想要登录你的网站时 调用 navigator.credentials.get 这会返回一个凭据对象 你可以在服务器上对其进行校验 以验证用户身份
这些是 Web 身份验证 API 的入口点 现在让我们看一下如何使用它们 在你的网站上设置面容 ID 和触控 ID 进行功能检测非常简单 只需调用 PublicKeyCredential.isUserVerifying- PlatformAuthenticatorAvailable 这将会返回一个 Boolean 来告诉你是否可以使用该功能 现实是时候引导用户了 为此 你可能需要先让用户 使用其老式密码凭据登录 然后你可以向用户显示一则通知 写上 “你好 我们提供了一项很酷的新功能 可让你下次登录时 使用面容 ID 或触控 ID 绕过使用用户名和密码 你想启用该功能吗?” 通知可以是完整的网页 横幅或浮动弹出窗口 这取决于网站的样式 在我建立的这个 Shiny 网站中 我决定使用整页通知 (下次登录时 你是否希望绕过用户名和密码 使用触控 ID?) 这就是通知 此时大多数用户可能都会按下“好的” 然后 为了使用 Web 身份验证 API 启用触控 ID 你应该使用以下脚本来建设你的网站 首先 我们来构造传递给方法的选项 它看起来很吓人 但是 在我为你详细解释之后 你会发现它实际上非常简单 首先你需要告诉浏览器你的网站是什么 然后是有关用户的一些信息 然后你可以指定要使用哪种加密 接下来是给加密的挑战 然后告诉浏览器 你需要使用平台身份验证器 这是这里的关键选项 最后 这完全是可选择的 由于 Shiny 有一些特殊的安全要求 因此它决定选择加入证明 看到了吧?很简单 现在你要把这些选项传递给 navigator.credentials.create 然后 Safari 浏览器将处理用户界面 并返还给你 PublicKeyCredential 不过在用户激活的事件中 调用此方法很重要
让我们看一个演示 了解如何将所有东西组合在一起 首先 我使用主要凭据来登录 Shiny 然后我收到通知 我是说 为何不接受?
然后 Safari 浏览器会出现一个 确认用户界面 点击“好的” 然后使用触控 ID 我登录好了 以上就是全部的用户引导体验 很好 但是我们只是完成了一半 你刚刚看到的是前端用户体验 我们仍然需要在后端做一些事情 来处理响应
下面我们简要看一下响应 首先 它包含一个 ID 你应该保存下来 以便在将来引用该特定凭据 其次 它包含一个针对注册的响应 在该响应中 你将获得 浏览器生成的一些元数据供你验证 然后是响应的重要内容 一个 attestationObject 其中包含公钥数据 和证明证书 如果你之前未选择使用证明 你将返回一条“无”证明声明 正如此处所示 以上就是对响应的概述 服务器的配置不同 代码可能会非常不同 但是这里有一份清单 你应按照此顺序进行操作 首先 验证所有元数据 客户端数据和身份验证器数据 其次 如果你选择使用证明 则应验证证明声明 第三 保存凭据 ID 和公钥数据 以备将来登录时使用 最后 你可以选择设置服务器端 cookie 以指示此设备上的特定帐户 可启用面容 ID 或触控 ID 这样会使重新认证过程变得更加容易 以上就是引导用户所需要做的事情 下面我们介绍登录 如果你在注册过程中 保存了已启用触控 ID 帐户的 cookie 那么现在可以将其作为登录的快速路径 整理成清单 为了将触控 ID 用于快速路径 你将需要以下脚本 登录的公式和注册很相似 这里必不可少的事情就是挑战 就像其他任何公钥加密一样 然后 这将有助于你告诉 Safari 浏览器 你计划使用的确切凭据 这样 Safari 浏览器 可以为用户提供最优化的用户界面 最重要的是 你需要指定传输方式 现在你把这些选项传递给 navigator.credentials.get 然后 Safari 浏览器将处理用户界面 并为你返回 PublicKeyCredential 就像注册一样 此外 还是和注册一样 在用户激活的事件中调用该方法很重要 让我们看一个演示 了解如何把这些结合在一起 我单击“登录”按钮 Safari 浏览器 随后将显示一个确认用户界面 点击“继续” 然后触控 ID 我进来了 因此使用触控 ID 进行登录就是这么简单 现在我们转向后端 在登录情况下 返回的 PublicKeyCredential 略有不同 现在响应的类型为 AuthenticatorAssertionResponse 这里响应的重要部分是签名 没错 以前常用的那种签名 你需要对每个公钥加密进行验证 这就是响应 此处的登录清单比注册部分要简单得多 首先 你需要验证该用户 ID 确实是你的用户 然后检查凭据 ID 是否与该用户 ID 相关联 完成此操作后 再验证其他的所有元数据 最后 验证签名 然后 你可以让用户登录 就完成了
这是在 Web 上启用面容 ID 和触控 ID 所需要做的一切 我来总结一下这三件事 首先 你需要检测功能是否存在 然后在用户通过传统机制登录后 你应该立即显示一条通知 请求用户启用该功能 这样以后的登录 你就可以接受面容 ID 或触控 ID 了
Safari 浏览器中的 Web 面容 ID 和触控 ID 可以作为 SFSafariViewController and ASWebAuthenticationSession 在 macOS、iPadOS 和 iOS 上使用
最后 介绍一些最佳做法 最重要的一点是 使用此功能登录是一种选择方式 但不能成为唯一的方式 由于私钥已绑定到设备 如果该功能是登录网站的唯一方法 那么一旦用户丢失了设备 他们将永远不能再登入账户 使用功能检测而不是用户代理字符串 来检测此功能
在用户激活的事件中调用 navigator.credentials.create and.get 如果你需要设置一个标志 来指示设备上的帐户是否启用了此功能 请使用服务器端安全的 HttpOnly cookie 这将为你提供最长的存储时间 最后 对于已经通过 Web 身份验证 启用了安全密钥的网站 你应该考虑把此功能和安全密钥 一起提供给用户是否合理 因为端到端的用户体验大不相同
总之 今天我介绍了 Web 的面容 ID和触控 ID 这可提供无障碍的用户体验 与强大的多因素身份验证机制 它可以轻松被整合到你的网站中 来简化用户的登录体验 而且无需更改管理用户会话状态的方式 请立即开始测试此功能 并将任何可能的漏洞提交到 反馈助理或 bugs.webkit.org 感谢观看
-
-
7:44 - Feature detection
// Feature detection const isAvailable = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(); if (isAvailable) { // Continue to enrollment or sign in // ... }
-
8:42 - Enrollment
// Enrollment const options = { publicKey: { rp: { name: "example.com" }, user: { name: "john.appleseed@example.com", id: userIdBuffer, displayName: "John Appleseed" }, pubKeyCredParams: [ { type: "public-key", alg: -7 } ], challenge: challengeBuffer, authenticatorSelection: { authenticatorAttachment: "platform" }, attestation: "direct" } }; const publicKeyCredential = await navigator.credentials.create(options);
-
11:42 - Sign in
// Sign in const options = { publicKey: { challenge: challengeBuffer, allowCredentials: [{ type: "public-key", id: credentialIdBuffer, transports: ["internal"] }] } }; const publicKeyCredential = await navigator.credentials.get(options);
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。