Authn.tech
首页
  • SAML 2.0
  • OAuth 2.0
  • OIDC
  • WebAuthn / Passkey
  • MFA / TOTP
  • 工具总览
  • JWT 解析与验签
  • JWT 签名生成
  • JWK / 密钥生成
  • JWK / JWKS → PEM
  • PKCE 生成器
  • OIDC Discovery
  • TOTP 工具
  • WebAuthn 演示
  • SAML 编解码
  • SAML Metadata 解析
  • SAML Response 解析
  • X.509 证书解析
  • Base64URL
  • 端点与说明
  • OIDC 登录演示
GitHub
首页
  • SAML 2.0
  • OAuth 2.0
  • OIDC
  • WebAuthn / Passkey
  • MFA / TOTP
  • 工具总览
  • JWT 解析与验签
  • JWT 签名生成
  • JWK / 密钥生成
  • JWK / JWKS → PEM
  • PKCE 生成器
  • OIDC Discovery
  • TOTP 工具
  • WebAuthn 演示
  • SAML 编解码
  • SAML Metadata 解析
  • SAML Response 解析
  • X.509 证书解析
  • Base64URL
  • 端点与说明
  • OIDC 登录演示
GitHub
  • WebAuthn / Passkey

    • WebAuthn 概述
    • 核心概念
    • 注册与认证流程
    • 参数与数据结构参考

参数与数据结构参考

本页为字段级速查。概念解释见 核心概念,用法见 流程。除特别说明外,二进制字段在浏览器 API 中为 ArrayBuffer/BufferSource,在 JSON 传输中约定用 Base64URL(无填充) 编码。

PublicKeyCredentialCreationOptions(注册)

传给 navigator.credentials.create({ publicKey })。

字段类型必填说明
rp对象是依赖方信息。rp.id 为 rpId(默认当前 origin 的有效域),rp.name 为展示名。
user对象是user.id(二进制,用户不透明句柄,勿放邮箱等 PII)、user.name(登录名)、user.displayName(展示名)。
challengeBufferSource是一次性随机质询,≥ 16 字节。
pubKeyCredParams数组是RP 可接受的算法,按优先级排列,每项 { type: "public-key", alg },alg 为 COSE 标识(见下表)。
timeoutnumber否毫秒,建议 60000。仅为提示,浏览器可忽略。
excludeCredentials数组否已注册凭证列表,防止在同一认证器重复注册。每项 { type, id, transports? }。
authenticatorSelection对象否认证器筛选,见下。
attestationstring否none(默认/推荐)、indirect、direct、enterprise。
extensions对象否扩展,如 credProps(回报是否创建了 resident key)。

authenticatorSelection 子字段

字段取值说明
authenticatorAttachmentplatform / cross-platform限定平台认证器或漫游安全密钥;省略则不限。
residentKeyrequired / preferred / discouraged是否创建可发现凭证(Passkey)。required 强制驻留。
requireResidentKeyboolean旧字段,为兼容保留;true 等价 residentKey: "required"。
userVerificationrequired / preferred / discouraged是否要求用户验证(UV)。

PublicKeyCredentialRequestOptions(认证)

传给 navigator.credentials.get({ publicKey })。

字段类型必填说明
challengeBufferSource是一次性随机质询。
timeoutnumber否毫秒,提示性。
rpIdstring否依赖方标识,默认当前 origin 的有效域;须与注册时一致。
allowCredentials数组否允许使用的凭证列表 { type, id, transports? };免用户名 Passkey 登录时留空。
userVerificationstring否required / preferred / discouraged。
extensions对象否认证扩展。

clientDataJSON

由浏览器生成的 JSON(以 UTF-8 字节返回),页面 JS 无法篡改。

字段说明
type注册为 "webauthn.create",认证为 "webauthn.get"。
challengeRP 下发 challenge 的 Base64URL 编码。
origin发起页面的完整 origin,如 https://login.example.com。
crossOrigin是否在跨域 iframe 中发起,通常 false。
topOrigin仅在 crossOrigin 为 true 时出现,顶层 origin。

示例:

{
  "type": "webauthn.get",
  "challenge": "YXV0aC1jaGFsbGVuZ2UtcmFuZG9t",
  "origin": "https://login.example.com",
  "crossOrigin": false
}

authenticatorData 结构

一段二进制,注册与认证都会返回(注册时封装在 attestationObject 内)。字节布局:

偏移长度字段说明
032 BrpIdHashSHA-256(rpId),RP 须核对。
321 Bflags位标志,见下。
334 BsignCount大端 32 位签名计数器。
37可变attestedCredentialData仅当 AT 位为 1(注册时)出现,含 AAGUID(16B)、credentialId 长度(2B)、credentialId、credentialPublicKey(COSE)。
之后可变extensions仅当 ED 位为 1 时出现,CBOR 编码。

flags 位定义

位名称含义
bit 0 (0x01)UPUser Present,用户在场。
bit 2 (0x04)UVUser Verified,用户已验证(多因素)。
bit 3 (0x08)BEBackup Eligible,凭证可被备份/同步。
bit 4 (0x10)BSBackup State,凭证当前已备份/已同步。
bit 6 (0x40)ATAttested credential data included(注册时置 1)。
bit 7 (0x80)EDExtension data included。

提示

BE/BS 用于区分同步型 Passkey(可跨设备)与设备绑定凭证。若业务要求凭证不可离开设备,可检查 BE=0。

COSE 算法标识

pubKeyCredParams[].alg 使用 COSE Algorithm 值(IANA 注册,均为负数):

alg名称说明建议
-7ES256ECDSA + P-256 + SHA-256首选,几乎所有认证器支持
-8EdDSAEd25519支持则可选,性能好
-35ES384ECDSA + P-384 + SHA-384少见
-36ES512ECDSA + P-521 + SHA-512少见
-257RS256RSASSA-PKCS1-v1_5 + SHA-256兼容旧 TPM/Windows Hello,建议一并提供
-258RS384RSASSA-PKCS1-v1_5 + SHA-384罕见
-259RS512RSASSA-PKCS1-v1_5 + SHA-512罕见
-37PS256RSASSA-PSS + SHA-256部分 TPM

提示

实践中提供 [-7, -257] 即可覆盖绝大多数认证器:-7(ES256)覆盖现代平台与安全密钥,-257(RS256)兼容部分 Windows Hello / TPM 场景。

排错速查表

现象 / 报错常见原因处理
SecurityError(create/get)rp.id/rpId 不是当前 origin 的有效域;非 HTTPS(localhost 除外)修正 rpId 为可注册域;使用 HTTPS
NotAllowedError用户取消、超时,或 origin/权限策略不允许提示重试;检查 timeout 与 Permissions-Policy: publickey-credentials-*
InvalidStateError(注册)该认证器已注册过(命中 excludeCredentials)提示"此设备已注册",引导登录
ConstraintErrorresidentKey: required 或 UV 要求认证器无法满足放宽为 preferred,或更换认证器
服务端 challenge 不匹配challenge 未存/已过期;Base64URL 解码错误服务端存储并绑定会话;确认用 Base64URL
服务端 origin 校验失败允许列表缺该 origin;协议/端口不一致精确配置合法 origin 列表
验签失败验签数据拼接错误(应为 authData ‖ SHA-256(clientDataJSON));算法与存储不符;ECDSA 签名为 DER 编码需正确解析复核验签流程,优先用成熟库
signCount 始终为 0同步型 Passkey / 某些平台认证器视为正常,不据此拒绝
Base64URL 相关乱码与标准 Base64 混用 +//=统一 Base64URL 无填充编解码

相关阅读:概述 · 核心概念 · 注册与认证流程。多因素与联合登录见 ../mfa/、../oidc/。

最近更新: 2026/7/3 13:26
贡献者: linux, Claude Fable 5
Prev
注册与认证流程