在两个不同的浏览器上使用 TouchID 进行 WebAuthn 身份验证和注册?

WebAuthn authentication and registration using TouchID on two different browsers?

一个人注册一个新帐户(通过 credentials.create)并随后使用同一浏览器登录(通过 credentials.get)的情况很简单,因为当时 credentials.create被调用时,用户必须授予他们的浏览器权限,才能在给定域中使用 Touch ID。例如,请参见下图,这是一个提示用户允许在给定域上使用 Touch ID 的模态,由 credentials.create:

触发

如果您在上面显示的模式中select“确定”,您可以完成 Touch ID 注册。当您随后 使用相同的浏览器 登录您的帐户时,您会看到如下所示的模式,它提供了使用安全密钥和之前注册的 Touch ID 进行身份验证之间的选择。此模态由 credentials.get:

触发

问题在于:如果用户通过另一个浏览器(例如 Chrome)使用 Touch ID 创建帐户 (credentials.create),然后尝试在 (credentials.get) 上进行身份验证Safari,Safari 认为他们只能访问安全密钥,并且不提供 Touch ID 作为选项。参考如下:

这是 WebAuthn 本身的已知限制吗?人们通常会使用不同的浏览器访问同一个网站,期望他们可以在任何浏览器上登录,而不管他们用来创建帐户的浏览器是什么。鉴于此,如果 WebAuthn 不支持此行为,那就麻烦了。

最重要的是 - 开发人员如何解决这个问题?您是否告知用户,他们不仅与最初注册到其帐户的内部设备相关联,而且还与他们使用的浏览器相关联?您是在 credentials.get 之前调用 credentials.create 吗?这似乎是一个 hack,但我对任何解决方案都感兴趣。

非常感谢。

Is this a known limitation of WebAuthn itself?

这与 WebAuthn API无关,而与 macOS 无关。迄今为止,macOS 是一个需要 WebAuthn 凭据管理来考虑凭据在哪个浏览器中注册的平台

...how are devs getting around this issue?

解决此问题的一种方法是在注册时(通过传统用户代理、较新的 navigator.userAgentData 等)使用新凭据存储用户的 OS 和浏览器。然后,在 auth 处,获取用户当前的 OS 和浏览器信息,并使用它来过滤凭据以包含在 allowCredentials 中,您将传递给 navigator.credentials.get()。如果凭据在 macOS 上注册,则也按浏览器过滤;在其他平台上,您可以简单地按 OS.

进行过滤

如果过滤用户凭据后 allowCredentials 在 macOS 上为空(即因为用户有一个在 Safari 中注册的凭据,但用户当前正在使用 Chrome ) 您需要处理该问题并提示用户以其他方式登录,然后再提示他们在 Chrome.

中注册 Touch ID

处理起来非常烦人,但这是 mac 上 WebAuthn 的现实OS。 Apple 的密钥(现在在蒙特雷的技术预览版中)希望得到支持,一旦更广泛地推广,它将提供与 iOS' OS 级凭证存储类似的体验...