了解 Web Bluetooth API 对 Passkeys 的作用!学习蓝牙可用性检测如何通过 WebAuthn 增强跨设备身份验证 (CDA)。
Vincent
Created: August 8, 2025
Updated: August 8, 2025
See the original blog version in English here.
Our mission is to make the Internet a safer place, and the new login standard passkeys provides a superior solution to achieve that. That's why we want to help you understand passkeys and its characteristics better.
2.2 getDevices()
2.3 requestDevice()
Passkeys 是网络上新的登录标准。Passkey 的核心功能之一是通过蓝牙和二维码进行跨设备身份验证 (CDA)。在这种情况下,另一个 Web API 变得非常重要:Web Bluetooth API。
通过让 Web 应用能够直接与蓝牙设备交互,Web Bluetooth API 在确保安全高效的身份验证流程(尤其是在 CDA 方面)中扮演着至关重要的角色。
这篇博客文章将介绍 Web Bluetooth API 的工作原理,并探讨蓝牙检测对 Passkey 身份验证的影响。我们希望回答以下问题:
Web Bluetooth API 是一个 JavaScript 接口,允许 Web 应用访问蓝牙设备并与之通信。它是 HTML5 标准的一部分,并得到了 Chrome、Edge 和 Opera 等浏览器的支持。该 API 使 Web 应用能够:
Web Bluetooth API 有三个关键函数。
getAvailability()
返回一个 promise,该 promise 会解析为一个布尔值,指示用户代理是否支持蓝牙(即设备是否具有蓝牙模块)。一些用户代理允许用户配置一个选项,来指定此方法返回的值。
navigator.bluetooth.getAvailability().then((available) => { if (available) { console.log("This device supports Bluetooth!"); } else { console.log("Doh! Bluetooth is not supported"); } });
getDevices()
返回一个 promise,该 promise 会解析为一个 BluetoothDevices
数组,其中包含源站允许访问的设备(包括超出范围和已关机的设备)。权限是通过之前调用 Bluetooth.requestDevice()
获得的。
navigator.bluetooth.getDevices().then((devices) => { devices.forEach((device) => { console.log("Device:", device.name); }); });
requestDevice()
返回一个 promise,该 promise 会解析为一个带有指定选项的 BluetoothDevice
对象。如果没有选择器界面,此方法将返回第一个符合条件的设备。
navigator.bluetooth .requestDevice({ filters: [ { services: ["battery_service"], }, ], }) .then((device) => { console.log("Device:", device.name); }) .catch((error) => { console.log("Error:", error); });
详细信息和代码片段可以在这里找到。也可以在这里找到 Web Bluetooth 的 W3C 标准。
navigator.bluetooth.requestDevice
进行的设备发现必须由用户手势(如触摸或鼠标点击)触发。要检查是否支持 Web Bluetooth API,可以使用以下代码:
if ("bluetooth" in navigator) { // Web Bluetooth API is supported console.log("Web Bluetooth is supported!"); } else { // Web Bluetooth API is not supported console.log("Web Bluetooth is not supported!"); }
上面已经解释了如何调用具体的函数。
Web Bluetooth API 为开发者和用户提供了几个优势:
尽管有这些好处,Web Bluetooth API 仍存在一些局限性:
getAvailability()
也会返回 false。这是通过 Permissions-Policy:Bluetooth
控制的。同样,即使 getAvailability()
返回 true,蓝牙适配器也可能未通电,或者用户在被提示时可能会拒绝使用该 API 的权限。Web Bluetooth API 的采用率仍在增长。根据 Can I Use 的数据,截至 2024 年 6 月,全球 76.53% 的用户设备支持 Web Bluetooth API。
然而,Safari 和 Firefox 缺乏支持仍然是一个重大障碍,影响了这些浏览器上的用户体验。此外,某些功能(例如 Bluetooth.getDevices()
)必须由用户明确开启,这给在后台使用该 API 带来了挑战。
在此处查找最新数据: https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Bluetooth_API#browser_compatibility
当信赖方希望在其网站和应用程序中提供 Passkeys 时,他们应该了解蓝牙可用性的一个主要原因。
Passkeys 的一项创新功能是跨设备身份验证 (CDA)——也称为混合身份验证。该功能允许用户在一台设备(通常是台式机或笔记本电脑)上,通过二维码和蓝牙使用其移动设备进行身份验证。这种混合身份验证方法增强了安全性和便利性,提供了无缝的用户体验。如今,大多数非技术用户已经习惯了扫描二维码,无论是在新冠疫情期间用于登记,还是通过后来增加桌面支持的移动优先消息应用(例如 WhatsApp 或 Telegram)。
在任何 Passkey 项目的开始阶段,决定 CDA 策略至关重要。我们越依赖 CDA,其支持和可靠性就需要越好。因此,检测设备上的蓝牙可用性至关重要。
然而,并非所有设备都具备蓝牙功能,或者蓝牙可能被关闭。对于提供 Passkeys 的信赖方来说,检测蓝牙可用性至关重要,以便确定是否可以使用 CDA,或者是否需要另一种备用身份验证方法。Web Bluetooth API 提供了一个解决方案,使 Web 应用能够检查用户设备上的蓝牙可用性。
请记住,CDA 并不总是稳定的,有时会无故连接失败。此外,由于该 API 较新,API 有时会返回错误的结果。
Firefox 和 Safari 中 Web Bluetooth API 的不可用是一个问题,尤其是对于 Firefox。
Safari 的问题较小,因为可能执行 CDA 的 macOS 设备从早期型号开始就内置了蓝牙。但是,如果macOS 上的蓝牙无法正常工作,用户可能会在跨设备身份验证时遇到问题,需要排查设置或恢复到备用方法。运行 Safari 的 iPhone 从一开始就内置了蓝牙。
不过,Firefox 是一个大问题,因为它在 Windows 设备上很受欢迎。如果用户使用 Firefox 并希望使用 CDA,由于 Web Bluetooth API 未实现,信赖方无法可靠地确定蓝牙是否可用。这可能会导致糟糕的用户体验,用户可能会在某些环节卡住而不知所措。
正如我们在之前的博客中看到的,Windows 设备在 Passkey 采用方面相对落后(另请参阅 State of Passkeys)。让我们来看看蓝牙的普及程度如何。
Windows 10 没有严格的蓝牙要求,但大多数现代笔记本电脑和台式机都具备蓝牙功能。然而,用户可能已将其关闭,或者在某些配置中可能不可用,尤其是在定制的台式机上。
Windows 11 与 Windows 10 类似,并不强制要求蓝牙。然而,硬件集成化和现代化的趋势意味着大多数兼容 Windows 11 的设备很可能具备蓝牙功能。尽管如此,用户仍然可以禁用它,这会影响 CDA 的实现。
在下表中,您可以看到是否可以确定台式机设备是否支持蓝牙,从而可以用作 CDA 客户端:
操作系统 | 蓝牙硬件支持 | 浏览器蓝牙检测 | |||
---|---|---|---|---|---|
Chrome | Edge | Firefox | Safari | ||
Windows 10 | 低 | ✅ | ✅ | ❌ | ❌ |
Windows 11 | 中 | ✅ | ✅ | ❌ | ❌ |
macOS | 高 | ✅ | ❌ | ❌ | ❌ |
请记住,即使您的硬件支持蓝牙,用户也可能关闭了蓝牙功能。当蓝牙关闭时,用户仍然可以使用 CDA,因为用户仍然可以选择激活它,这在 Windows 和 Mac 上都有效: macOS 请求开启蓝牙
Windows 11 请求开启蓝牙
蓝牙可用性信息在 Windows 10 和 Windows 11 上尤其值得关注,因为这些系统上的蓝牙支持率较低,并且在基于 Passkey 的登录中,很可能需要进行跨设备身份验证。近期的 macOS 设备都支持蓝牙。这些 macOS 设备还可能直接访问存储在 iCloud 钥匙串中的 Passkeys,因此不是我们担心的重点。
在 Windows 10 和 Windows 11 上:使用 getAvailability()
来确定蓝牙是否可用。如果用户只有非 Windows 的 Passkeys,您可以立即回退到其他身份验证选项。
在只有混合 Passkeys 可用的情况下,触发 Passkey 身份验证不会成功,反而会给用户带来死胡同。对于 Windows 10 和 Windows 11 上的所有其他浏览器,不幸的是,没有其他方法可以确定是否支持 CDA。
Web Bluetooth API 是一个强大的工具,可以通过蓝牙功能增强 Passkey 身份验证。通过理解和利用这个 API,开发者可以创建更安全、更用户友好的身份验证方法。然而,他们也必须应对其局限性,并确保有强大的备用机制,以在不同浏览器和设备上保持无缝的用户体验。
通过这篇博客文章,我们回答了三个核心问题:
getAvailability()
、getDevices()
和 requestDevice()
等函数来使用 Web Bluetooth API,以检查蓝牙支持、列出可访问的设备并请求设备配对。有关 Web Bluetooth API 的更多信息和示例集,请点击此处。
Enjoyed this read?
🤝 Join our Passkeys Community
Share passkeys implementation tips and get support to free the world from passwords.
🚀 Subscribe to Substack
Get the latest news, strategies, and insights about passkeys sent straight to your inbox.
Related Articles
Table of Contents