You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebAuthn与OAuth/OIDC适配疑问:凭证及密钥相关技术问题

从OAuth 2.0/OIDC视角理解WebAuthn的核心疑问解答

WebAuthn本质是公钥认证协议,和OAuth的令牌机制逻辑不同——OAuth通过颁发/验证令牌实现授权,WebAuthn则依靠客户端(浏览器)与Authenticator(指纹/安全密钥等)生成的公钥对完成身份验证。下面针对你的疑问逐一说明:

1. 客户端需向服务器发送哪些数据(类似OAuth的access_token)?

WebAuthn分注册和认证两个核心流程,客户端提交的数据对应不同阶段:

  • 注册阶段:调用navigator.credentials.create()后,需把完整的PublicKeyCredential对象提交给服务器,核心内容包括:
    • id:凭证的唯一标识符
    • response.attestationObject:包含Authenticator生成的公钥、设备信息等关键数据
    • response.clientDataJSON:客户端生成的上下文数据(如请求来源、挑战值)
  • 认证阶段:调用navigator.credentials.get()后,提交的断言数据(类似OAuth的身份凭证)包含:
    • id:对应注册阶段的凭证ID
    • response.authenticatorData:Authenticator生成的会话数据(含用户验证状态、签名计数器等)
    • response.signature:Authenticator用私钥对挑战值等数据生成的签名
    • response.clientDataJSON:客户端上下文数据

这些数据不是令牌,而是供服务器验证身份的原始材料——服务器通过验证签名确认用户身份,而非像OAuth那样校验令牌有效性。

2. 服务器如何获取公钥来验证数据?

WebAuthn采用非对称加密,服务器仅需公钥验证签名(不存在解密操作),公钥在注册阶段获取:

  • 客户端提交注册请求的attestationObject后,服务器解析该二进制对象,从中提取Authenticator生成的公钥(格式为COSE密钥结构)
  • 服务器将公钥与用户ID、凭证ID关联存储,后续认证时,根据客户端提交的凭证ID取出对应公钥,验证签名的合法性

3. 哪类数据适合作为标准化的稳定用户ID?

推荐两种方案结合使用:

  • 服务器自有用户ID:比如系统内的UUID、自增ID,或符合OIDC sub字段标准的标识符——这是最稳定的选择,完全由服务器控制,不受Authenticator或WebAuthn协议限制,适合作为用户身份的核心标识
  • WebAuthn的userHandle:注册时由Authenticator返回的用户标识(可选),通常是服务器传入用户ID的哈希或原始值,可作为辅助标识,但注意部分Authenticator可能不返回userHandle,无法单独依赖
  • 避免用credentialID作为用户ID:credentialID是单个凭证的标识,一个用户可能拥有多个凭证(如多枚安全密钥),它是凭证的唯一标识,而非用户的

内容的提问来源于stack exchange,提问作者Matt Mazzola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:30:50