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:对应注册阶段的凭证IDresponse.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
相关产品推荐
相关产品推荐

