v1auth 上下文凭据管理
通行密钥
注册 WebAuthn 通行密钥:签发挑战与提交 attestation。
通行密钥是抗钓鱼的登录方式:私钥留在设备的安全芯片里,认证时只出示签名。注册同样分两步。
端点
| 方法 | 路径 | 说明 | 提权 |
|---|---|---|---|
POST | /v1/auth/credentials/passkey/options | 签发注册挑战 | max_age=300 |
POST | /v1/auth/credentials/passkey | 提交 attestation 落库 | 无 |
第一步:签发挑战
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
user_verification | preferred | required | 可选 | 缺省 preferred |
{ "success": true, "options": { "challenge": "...", "rp": { "id": "id.example.com" } }, "expires_in": 300 }user_verification: required 会让认证器强制校验(PIN 或生物识别),而不是仅仅确认「有人按了一下」。缺省 preferred 是为了兼容没有 UV 能力的实体安全密钥。
挑战保存在服务端。已注册的凭据会出现在 excludeCredentials 里,避免同一台设备被重复注册。
第二步:提交 attestation
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
response | object | ✅ | RegistrationResponseJSON,原样透传给 WebAuthn 校验 |
label | string | 可选 | 设备名,1–64 字符 |
{ "success": true, "credential": { "id": "cred_...", "type": "passkey", "display": "MacBook" } }挑战在验签之前就被消费
失败必须重新走第一步,不能拿同一个挑战重试。这是刻意的:挑战若可复用,一次注册请求就能被重放到多台设备上。
label 建议填:没有它,多把通行密钥在列表里全是同一句文案,用户无法判断该删哪一把。