# WebAuthn 支持

**URL:** https://meta.discourse.org/t/webauthn-support/126454
**Category:** Feature
**Tags:** rfc
**Created:** [2019 年8 月 21 日 23:20 UTC](https://meta.discourse.org/t/webauthn-support/126454 "2019-08-21T23:20:40Z")
**Posts on this page:** 20
**Page:** 2

<div class="post-metadata">

### Author: ![pmusaraj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pmusaraj/32/119489_2.png) [@pmusaraj](https://meta.discourse.org/u/pmusaraj)
#### Post date: [2019 年10 月 2 日 13:13 UTC](https://meta.discourse.org/t/webauthn-support/126454/21 "2019-10-02T13:13:41Z")

</div>

这非常棒！

不过有个小问题：在 Safari/Mac 上，Web 认证是一个仅限开发者的功能，默认处于关闭状态。启用后，它能正常工作。但我们应该在 Web 认证未启用时显示一条消息或警告。目前，在默认设置的 Safari 中，界面没有任何提示表明注册流程无法运行（控制台会报错）：

 ![image](https://global.discourse-cdn.com/meta/original/3X/6/4/645a2f5da4fa7b3fffdeaeee3ec00254cb442642.png)

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [2019 年10 月 2 日 19:48 UTC](https://meta.discourse.org/t/webauthn-support/126454/22 "2019-10-02T19:48:16Z")

</div>

我猜我们可以使用 `navigator.credentials` 进行特性检测。

---

<div class="post-metadata">

### Author: ![justin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/justin/32/157614_2.png) [@justin](https://meta.discourse.org/u/justin)
#### Post date: [2019 年10 月 2 日 20:34 UTC](https://meta.discourse.org/t/webauthn-support/126454/23 "2019-10-02T20:34:34Z")

</div>

> [@codinghorror](#):
>
> 谁说要有返回值？那是旧思维！现代人拥有多台设备

有些人即使觉得多设备很好，也很难证明额外支出的合理性 :smiley:

---

<div class="post-metadata">

### Author: ![Martin\_Brennan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/martin_brennan/32/157653_2.png) [@Martin\_Brennan](https://meta.discourse.org/u/Martin_Brennan)
#### Post date: [2019 年10 月 2 日 21:07 UTC](https://meta.discourse.org/t/webauthn-support/126454/24 "2019-10-02T21:07:37Z")

</div>

哎呀，我在 navigator.credentials.get 上做了功能检查，但忘了在 create 上做，抱歉！这会很快修复的！

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2019 年10 月 2 日 21:49 UTC](https://meta.discourse.org/t/webauthn-support/126454/25 "2019-10-02T21:49:57Z")

</div>

最新的提交似乎可以正常工作。我刚刚在我的安卓手机上成功使用了双因素认证（支持指纹！）。

---

<div class="post-metadata">

### Author: ![Martin\_Brennan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/martin_brennan/32/157653_2.png) [@Martin\_Brennan](https://meta.discourse.org/u/Martin_Brennan)
#### Post date: [2019 年10 月 2 日 22:09 UTC](https://meta.discourse.org/t/webauthn-support/126454/26 "2019-10-02T22:09:32Z")

</div>

嘿，Penar，我现在已经修复了这个问题，你能在 Safari 上检查一下吗？[https://github.com/discourse/discourse/pull/8146。我只是不确定我使用的功能检测方法在](https://github.com/discourse/discourse/pull/8146%E3%80%82%E6%88%91%E5%8F%AA%E6%98%AF%E4%B8%8D%E7%A1%AE%E5%AE%9A%E6%88%91%E4%BD%BF%E7%94%A8%E7%9A%84%E5%8A%9F%E8%83%BD%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95%E5%9C%A8) Safari 关闭该功能的情况下是否有效。

---

<div class="post-metadata">

### Author: ![pmusaraj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pmusaraj/32/119489_2.png) [@pmusaraj](https://meta.discourse.org/u/pmusaraj)
#### Post date: [2019 年10 月 2 日 23:45 UTC](https://meta.discourse.org/t/webauthn-support/126454/27 "2019-10-02T23:45:53Z")

</div>

Sam 抢先完成了合并，不过在 Safari 上看起来不错，谢谢 Martin！

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [2019 年10 月 5 日 05:09 UTC](https://meta.discourse.org/t/webauthn-support/126454/28 "2019-10-05T05:09:07Z")

</div>

没错，但在这种情况下，这是 Discourse 工作的正常部分，因此我们会承担相关费用。如果之前表述不够清楚，抱歉，希望现在清楚了？

---

<div class="post-metadata">

### Author: ![Rafe](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rafe/32/105093_2.png) [@Rafe](https://meta.discourse.org/u/Rafe)
#### Post date: [2019 年11 月 14 日 15:59 UTC](https://meta.discourse.org/t/webauthn-support/126454/29 "2019-11-14T15:59:13Z")

</div>

恭喜你们支持了 WebAuthn！看到你们没有使用 webauthn gem 而是自己实现了一个解决方案，这很有趣。如果有任何反馈给我们，我很乐意倾听 :smiley:

我注意到你们的实现 [仅支持算法 `-7` (ES256)](https://github.com/discourse/discourse/blob/427d54b2b00fa94474c0522eaed750452c4e7f43/lib/webauthn.rb#L9)，但根据 [微软的文档](https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/windows-integration/web-authentication#special-considerations-for-windows-hello)，Windows Hello 平台认证器（基于 TPM 2.0 硬件）需要 `-257` (RS256)。自 2016 年 7 月 28 日起，TPM 2.0 [已成为新 Windows 10 桌面型号的要求](https://docs.microsoft.com/en-us/windows/security/information-protection/tpm/tpm-recommendations#tpm-20-compliance-for-windows-10)，因此这涉及相当数量的硬件。

关于“登录流程”原型的一个建议：WebAuthn 有一个 [官方标志](https://github.com/apowers313/webauthn-logos)，可以用来替代通用的指纹图像。除了指纹识别外，面部识别、滑动图案或 PIN 码也是常见的用户验证选项。

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [2019 年11 月 14 日 22:01 UTC](https://meta.discourse.org/t/webauthn-support/126454/30 "2019-11-14T22:01:29Z")

</div>

@Martin_Brennan 对 :arrow_double_up: 有什么看法吗？

---

<div class="post-metadata">

### Author: ![martin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/martin/32/491371_2.png) [@martin](https://meta.discourse.org/u/martin)
#### Post date: [2019 年11 月 14 日 22:30 UTC](https://meta.discourse.org/t/webauthn-support/126454/31 "2019-11-14T22:30:27Z")

</div>

> [@Rafe](#):
>
> 恭喜支持 WebAuthn！很有趣看到你们没有使用 webauthn gem，而是自行实现了方案。如果有任何反馈给我们，我很乐意听取 :smiley:
> 
> 我注意到你们的实现[仅支持算法 `-7` (ES256)](https://github.com/discourse/discourse/blob/427d54b2b00fa94474c0522eaed750452c4e7f43/lib/webauthn.rb#L9)，但根据[微软的文档](https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/windows-integration/web-authentication#special-considerations-for-windows-hello)，Windows Hello 平台认证器（基于 TPM 2.0 硬件）需要 `-257` (RS256)。自 2016 年 7 月 28 日起，TPM 2.0 [已成为新 Windows 10 桌面型号的必备硬件](https://docs.microsoft.com/en-us/windows/security/information-protection/tpm/tpm-recommendations#tpm-20-compliance-for-windows-10)，因此涉及的硬件数量不容小觑。

感谢你的反馈，Rafe，我们确实需要在此处添加额外的算法。同时也感谢你提供官方标志的链接！我当初只设置一种算法的想法，是为了在 V1 版本中仅添加最少必需的支持算法以使功能正常运行，因为我不确定所有算法之间的细微差别，而且我能找到的所有示例都使用了 ES256。

至于当时为何选择不使用该 gem，我对此反复斟酌了很久，也深知迟早会面临关于这一决定的提问。我确实仔细阅读了该 gem 的大量代码，以更好地理解其实现。主要原因如下：

1. 不希望为 Discourse 增加额外的依赖。无论该 gem 的代码多么优秀，每个 gem 依赖都会带来额外的开销。
2. 希望深入理解 Discourse 这一关键安全模块的运作方式。我认为将代码保留在 Discourse 核心内部会使逻辑更清晰、更易于扩展，而无需面对所谓的“黑盒”。（这并非对该 gem 本身或其复杂性的指责，我意识到大家可以直接查看其代码，而且我发现那里面的逻辑非常容易理解）。
3. 不希望添加超出最低需求之外的代码来运行 WebAuthn。例如，我们在初始实现中省略了认证（attestation）。我认为，当我们只需要一把扳手时，没必要搭建整个工具棚。

话虽如此，我当时的决定可能有些误判。如果我们进入 WebAuthn 支持的 V2、V3 等版本，涉及认证、更多支持的算法以及其他功能，那么要让我们成为所谓的“WebAuthn 专家”可能会变得过于繁琐。到那时，我认为我们可以重新评估是否使用该 gem。

---

<div class="post-metadata">

### Author: ![martin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/martin/32/491371_2.png) [@martin](https://meta.discourse.org/u/martin)
#### Post date: [2019 年11 月 21 日 05:46 UTC](https://meta.discourse.org/t/webauthn-support/126454/34 "2019-11-21T05:46:01Z")

</div>

支持额外的 RS256 算法的功能现已合并 [FEATURE: Support RS256 algorithm for webauthn by martin-brennan · Pull Request #8385 · discourse/discourse · GitHub](https://github.com/discourse/discourse/pull/8385)

---

<div class="post-metadata">

### Author: ![terraboss](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/terraboss/32/381157_2.png) [@terraboss](https://meta.discourse.org/u/terraboss)
#### Post date: [2019 年12 月 10 日 21:50 UTC](https://meta.discourse.org/t/webauthn-support/126454/35 "2019-12-10T21:50:37Z")

</div>

看来，iOS 13.3 和 macOS Catalina 10.15.2 现在也支持 FIDO2 认证了 :tada:

> **此更新还包括错误修复和其他改进。此更新：**
> 
> > - 在 Safari 中增加了对符合 FIDO2 标准的 NFC、USB 和 Lightning 安全密钥的支持\*\*

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [2019 年12 月 11 日 00:24 UTC](https://meta.discourse.org/t/webauthn-support/126454/36 "2019-12-11T00:24:11Z")

</div>

可惜iPhone还需要第三方设备才行。希望iOS++能在设备认证和安全芯片方面内置此功能，就像Windows、macOS和Android那样。

---

<div class="post-metadata">

### Author: ![featheredtoast](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/featheredtoast/32/116994_2.png) [@featheredtoast](https://meta.discourse.org/u/featheredtoast)
#### Post date: [2019 年12 月 11 日 01:38 UTC](https://meta.discourse.org/t/webauthn-support/126454/37 "2019-12-11T01:38:06Z")

</div>

能看着 Discourse 登录，我真是太激动了！

说实话，我有点惊讶内置的身份验证器支持还没有到位……但无论如何这都是个令人振奋的消息——我会继续屏息以待。

---

<div class="post-metadata">

### Author: ![Gordon\_Grace](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gordon_grace/32/151076_2.png) [@Gordon\_Grace](https://meta.discourse.org/u/Gordon_Grace)
#### Post date: [2020 年2 月 3 日 03:01 UTC](https://meta.discourse.org/t/webauthn-support/126454/38 "2020-02-03T03:01:38Z")

</div>

我发现在托管的 Discourse 实例中，为部分用户启用双因素认证（2FA）时可能存在 UI 不一致的问题：

在列出所有“工作人员”用户时，我的账户 **并未** 显示已启用 2FA：

 ![Annotation 2020-02-03 135308](https://global.discourse-cdn.com/meta/original/3X/0/6/06ac42f6384e8b4a36e19ed2fb657656982d9186.png)

- 账户摘要页面暗示 2FA 已开启，因为按钮文本显示为“管理双因素认证”。
- 双因素认证页面显示已启用安全密钥，并且第二因素可以被禁用。
- 同一实例中选择使用基于令牌的身份验证器（未使用安全密钥）的其他用户，在“所有用户”列表中会显示锁形图标。

请告知这是否是一个 UI 缺陷，还是仅添加安全密钥对于该平台而言不足以启用 2FA。

---

<div class="post-metadata">

### Author: ![martin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/martin/32/491371_2.png) [@martin](https://meta.discourse.org/u/martin)
#### Post date: [2020 年2 月 3 日 03:04 UTC](https://meta.discourse.org/t/webauthn-support/126454/39 "2020-02-03T03:04:51Z")

</div>

我会查看一下这个问题，但我的初步判断是，如果实际的 2FA 部分显示正确，那么用户列表中的问题可能只是一个界面显示错误。感谢您的反馈！

---

<div class="post-metadata">

### Author: ![martin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/martin/32/491371_2.png) [@martin](https://meta.discourse.org/u/martin)
#### Post date: [2020 年2 月 3 日 03:21 UTC](https://meta.discourse.org/t/webauthn-support/126454/40 "2020-02-03T03:21:13Z")

</div>

这就是问题所在。修复正在构建中，我一旦能够操作就会合并：[FIX: Admin user list not showing 2FA icon for only security keys enabled by martin-brennan · Pull Request #8839 · discourse/discourse · GitHub](https://github.com/discourse/discourse/pull/8839)

编辑：现已修复。

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [2020 年2 月 13 日 06:23 UTC](https://meta.discourse.org/t/webauthn-support/126454/41 "2020-02-13T06:23:05Z")

</div>

> [@Falco](#):
>
> 真可惜，iPhone 还需要第三方设备才能实现这一功能。我希望 iOS++ 能内置设备认证和安全芯片，就像 Windows、macOS 和 Android 那样。

[欢迎来到这个勇敢的新世界](https://www.forbes.com/sites/kateoflahertyuk/2020/02/12/apple-just-made-a-striking-new-security-move-that-could-impact-all-users/#56156ec731a7)

> Apple [已加入](https://fidoalliance.org/members/) FIDO 联盟（即快速在线身份联盟），该组织成员已包括 Google、Intel、Microsoft 和 Samsung 等巨头。

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [2020 年8 月 20 日 15:17 UTC](https://meta.discourse.org/t/webauthn-support/126454/42 "2020-08-20T15:17:41Z")

</div>

> [@Falco](#):
>
> 遗憾的是，iPhone 还需要第三方设备才能实现这一功能。我希望 iOS++ 能像 Windows、macOS 和 Android 一样，内置设备认证和安全芯片支持。

在 iOS 14 上，这可以通过 TouchID 或 FaceID 实现。

[Previous page](https://meta.discourse.org/t/webauthn-support/126454.md?page=1)

[Next page](https://meta.discourse.org/t/webauthn-support/126454.md?page=3)
