Appearance
概览
transports 是提示性(hint)字段,告诉浏览器“这枚凭据对应的认证器通常通过什么介质可达”。它来自注册时的 AuthenticatorAttestationResponse.getTransports(),建议你把返回值存到数据库;认证时再放进 allowCredentials[i].transports,以便浏览器优先尝试合适的介质。该字段不是安全校验的一部分,浏览器可忽略未知值。(MDN Web Docs)
规范定义的取值(WebAuthn Level 3)
WebAuthn L3 的
AuthenticatorTransport枚举:"usb" | "nfc" | "ble" | "smart-card" | "hybrid" | "internal"。(W3C)
usb可移除的 USB 安全密钥(如 YubiKey)。典型用于台式机有线插拔。(W3C)nfc通过近场通信(NFC)触达的漫游认证器;常见于手机轻触安全钥。(W3C)ble通过蓝牙低功耗(BLE)连接的漫游认证器。(W3C)smart-card通过 接触式智能卡(ISO/IEC 7816) 的认证器;适配某些企业/政务卡式设备。这是 L3 新增枚举。(W3C)hybrid混合传输:通常指跨设备认证(电脑上登录,拿手机确认),由近距信道 + 云辅助组合完成;是现代 passkeys(CDA/caBLE) 的核心通道。(W3C)internal平台认证器(设备内置,不可移除),如 Windows Hello、Touch ID、Android 平台密钥。(W3C)
说明:MDN 的
getTransports()文档同样列举了ble / hybrid / internal / nfc / usb,并建议把注册期获得的数组原样存储并在认证时回填为allowCredentials[*].transports。(MDN Web Docs)
兼容与历史值
cable(历史/实现细节) 早期生态(尤其是 Chrome/DevTools 与部分库)里把“cloud-assisted BLE(caBLE)”直接写成cable。在 L3 里正式名称为hybrid;若你读取到cable,可以把它等价视作hybrid。(chromedevtools.github.io)
实务建议
- 注册时保存 用
response.getTransports()取到数组(如["internal"]或["usb","nfc"]),与凭据一起存库。下次认证时作为 hint 提供,减少用户被动尝试的摩擦。(MDN Web Docs) - 认证时回填 为每个
allowCredentials[i]设置transports: storedTransports。如果做无用户名/可发现凭据 + Conditional UI,通常不传allowCredentials(因此也没有transports),由浏览器自行发现。(MDN Web Docs) - 忽略未知值 规范要求客户端忽略未知
transports,所以直接存原值是安全的。(W3C) - 与“提示(Hints)”配合 当你不提供
allowCredentials(比如做直登),可用 PublicKeyCredentialHint(如"security-key" | "client-device" | "hybrid")引导 UI,弥补没有transports的情况。(W3C)
一览速查表
| 取值 | 设备/场景 | 典型例子 |
|---|---|---|
usb | 漫游钥,经 USB 连接 | YubiKey USB-A/C |
nfc | 漫游钥,经 NFC 轻触 | 手机 NFC 读卡 |
ble | 漫游钥,经 BLE | 蓝牙安全钥 |
smart-card | 接触式智能卡 | PIV/CAC 卡座 |
hybrid | 跨设备 passkey(近距 + 云辅助) | 用手机给电脑“确认登录” |
internal | 平台认证器(不可移除) | Windows Hello / Touch ID |
(如遇到历史值 cable,按 hybrid 处理。)(chromedevtools.github.io)
如果你愿意,我可以给出你项目里保存/回填 transports 的最小改动片段(只贴需要改的行,复杂逻辑行会上方加中文注释),并顺手加一条**cable→hybrid 兼容映射**。