使用passkeys的无密码登录

在跟进 Support passwordless login with Passkeys 并经过几周的内部测试后,我们很高兴地宣布 Discourse 已支持通行密钥。

什么是通行密钥?

通行密钥是比使用密码进行身份验证更安全、更简单的替代方案。创建和使用通行密钥现在已广泛支持跨平台和浏览器。与密码相比,通行密钥具有更强的内置安全性,因为它们使用平台生成的强凭据和生物识别身份验证(如 TouchID、FaceID、PIN 或设备密码)。通行密钥还安全免受服务器端泄露(私钥部分永远不会离开设备)或网络钓鱼(每个密钥仅与一个网站/服务关联)的影响。

功能发布

如果您是托管客户,通行密钥支持将在未来几天内发布到您的实例。如果您想立即启用它们,请在此处的 meta 上联系 @team 或发送电子邮件至 team@discourse.org

如果您是自托管 Discourse,请注意,该功能 将很快在 Discourse 核心中默认启用 已在 此提交 中默认启用。如果您想禁用它,可以通过 Rails 控制台进行操作:

launcher enter app
rails c
SiteSetting.enable_passkeys = false

请注意,通行密钥只能在启用了本地登录的 Discourse 实例上使用。如果您的实例不使用本地登录,通行密钥功能将不起作用。


启用该功能后,用户可以通过转到用户首选项的安全选项卡来为其帐户添加通行密钥:

注册通行密钥后,用户可以通过用户名字段下方的自动填充下拉菜单(1)或单击“使用通行密钥登录”按钮(2)进行登录。

更多详情

有许多关于通行密钥的资源和指南。我发现以下内容最有用:

可能的未来改进

在功能初步发布完成后,我们可能会考虑进行以下改进:

  • 允许在创建帐户时设置通行密钥。
  • 允许在使用确认敏感操作时使用通行密钥(目前在用户首选项的安全选项卡中支持,但在某些仅管理员屏幕中不支持)。
  • 允许完全删除密码(按用户或按实例?)。
32 个赞

这是一个很棒的补充!但是,通过使用密码登录可以轻松绕过安全优势。我本以为在输入密码后仍然会提示我输入密钥,但它只是用密码登录了。可以通过在单独的 2FA 设置中重新注册安全密钥来避免这种情况,但这并不明显,而且很麻烦。

3 个赞

谢谢 @Be0

在大多数当前的实现中,密钥尚未以这种方式部署。它们被视为独立于双因素身份验证(2FA),请参阅此关于YouTube 方法的报告。我认为行业将慢慢适应这一点。

要实现您期望的功能,需要进行两项更改:

步骤 1:允许将密钥用作双因素身份验证(目前,如您所注意到的,安全密钥需要单独注册)
步骤 2:当用户添加了密钥时,强制在密码登录时进行双因素身份验证

步骤 1 对我来说是合理的,而且不会造成干扰。步骤 2 也是合理的,但会造成一些干扰,如果用户从浏览器中删除了密钥(或在给定设备上没有密钥),则访问将被阻止。

但我认为值得研究一下。

7 个赞

您好,在移动设备(Firefox)上浏览我的 Discourse 站点时,不支持 passkeys,这是预期的吗?

4 个赞

我认为 Firefox 正在积极地在全平台添加 passkeys 支持,但如果我正确理解此图表,它仍未 100% 完成。

根据您的版本和操作系统,它可能尚未提供。我刚刚在 macOS 和 iOS 上进行了快速测试,在这里的 meta.discourse.org 上,passkey 身份验证对我来说是可用且可行的。

5 个赞

帖子已拆分为新主题:使用 passkeys 配合 vaultwarden 时遇到问题

如果浏览器自动填充功能因某种原因未包含密钥,您可以点击“使用密钥登录”按钮。

3 个赞

您可以在此处向 @team 发送私信,或发送电子邮件至 team@discourse.org,我们可以为您禁用此功能。我们不建议这样做,因为网络上的许多服务都正在采用密匙作为更安全的身份验证选项。

4 个赞

是否计划最终能够完全禁用密码(最好是基于账户设置,我可以看到强制整个网站这样做不会有好结果)?因为同时启用通行密钥和密码会限制通行密钥的实用性。你可以通过设置一个极其复杂的密码然后从不使用它来规避这个问题,但这只是回避了通行密钥的意义。

4 个赞

是的,我认为这会很好(并且可以提高账户的安全性)。我现在将其添加到 OP 的“未来可能的改进”部分。

3 个赞

这对通行密钥的安全性至关重要。如果我无法禁用密码登录,它们只不过是一种便利。

2 个赞

如果我理解的通行密钥机制是正确的,那么您需要安装一个受信任的容器,例如密码管理器,来存储访问密钥。淘汰密码假设所有用户都安装了这样的管理器,那么那些没有安装的用户将如何登录?

1 个赞

不使用双重身份验证的用户访问需要双重身份验证的网站的方式也是如此——他们无法访问。

这并不是一个真正的担忧,因为 Chrome、Safari、Windows、iPhone、Android、Yubi 等都可以替代密码管理器(无论如何,您在 2024 年都应该已经在使用它们了),并且它们都支持通行密钥。

我也不是建议强制所有用户都不能使用密码(尽管我对此没意见),但如果您作为通行密钥用户无法禁用密码,那么通行密钥的作用就大大减小了,您仍然完全容易受到网络钓鱼的攻击。

1 个赞

如果我为 Discourse 选择通行密钥,我将不再使用我的密码,那么我如何会被钓鱼?我理解密码登录的恶意或暴力破解攻击风险仍然存在,你建议按用户禁用密码是有效的,但这并非通过钓鱼?

1 个赞

关于仅使用 passkeys 而不使用密码创建账户的可能性,有什么最新消息吗?既然无论如何都需要密码,支持 passkeys 似乎几乎没有意义。

5 个赞

是否可以找出有多少人(如果有的话)在使用此功能?

如果可以通过常规的站点设置禁用它,那就好了。

1 个赞

您可以通过此 Rails 命令查看已创建的 passkey 数量:

UserSecurityKey.where(factor_type: 1).count
1 个赞

谢谢。抱歉问了一个这么基础的问题,但这是我接下来要输入的内容吗?

launcher enter app
rails c
2 个赞

为了方便我自己参考,我使用了:

  • cd /var/discourse
  • ./launcher enter app (因为没有 ./ 时,它会显示“launcher: command not found”)
  • rails c (等待了一会儿)
  • SiteSetting.enable_passkeys = false
  • Control-D 退出 Rails 控制台
  • Exit 退出应用程序

最终结果是,如预期所示,使用密码匙的选项消失了。谢谢。

1 个赞

有一名用户创建了通行密钥。

我使用 UserSecurityKey.where(factor_type: 1) 获取了 user_id,并使用 Data Explorer 获取了用户名。

我们需要做什么来确保删除通行密钥选项后不会出现任何问题?

用户将被注销,还是在注销后将无法再使用通行密钥登录?

用户是否已经拥有普通密码,或者至少现在能够生成一个?

1 个赞