Passkey 登录的端到端契约:注册、校验、管理与恢复
客户端成功弹出 Face ID、指纹或系统凭据选择器,并不表示 Passkey 已经安全落地。真正的信任边界在服务端:挑战是否一次性、RP ID 与 Origin 是否匹配、签名是否来自已绑定公钥、凭据究竟属于哪个账号,以及用户丢失所有凭据后如何恢复。
Passkey 是一次完整的身份系统改造,不是把密码输入框换成一个按钮。
先建立账号与凭据模型
一个账号应允许绑定多个 WebAuthn 凭据。服务端为每个凭据保存 credential ID、公钥、内部账号 ID、注册时间、最近使用时间、撤销状态,以及实现风控所需的 AAGUID、备份状态和签名计数信息。私钥只留在认证器或凭据提供商中,绝不会上传服务器。
WebAuthn 的 user handle 是不透明字节序列,最长 64 字节,不应含邮箱、手机号或用户名。使用稳定的随机内部 ID,使用户修改登录名时无需重建 Passkey,也避免凭据元数据泄露个人信息。
注册从服务端挑战开始
用户创建 Passkey 前应已有可信会话;为高价值账号增加近期重新认证。服务端生成高熵随机 challenge,绑定账号、注册意图、RP ID 和短过期时间,并保证只消费一次。challenge 不能由客户端生成,也不能在失败后无限复用。
注册选项包含稳定的 RP ID、不透明 user ID、支持的算法、用户验证要求,以及已有 credential ID 组成的 excludeCredentials。RP ID 通常是服务域名;一旦生产凭据依赖它,随意换域名会让旧凭据不可用。
客户端返回结果后,服务端使用成熟的 FIDO/WebAuthn 库完成校验,至少包括:clientDataJSON 的操作类型、challenge 与允许的 Origin;authenticator data 中的 RP ID hash、用户在场和所需的用户验证标志;返回算法和公钥格式;credential ID 未绑定其他账号。只有全部通过才在事务中消费 challenge 并保存公钥。
登录验证每一层绑定
登录同样由服务端签发一次性 challenge。可发现凭据允许 allowCredentials 为空,由系统展示当前 RP 可用账号,减少先输入用户名的步骤。收到 assertion 后,服务端必须验证:challenge、操作类型、Origin、RP ID hash、用户在场、所需用户验证、credential ID 与账号映射,以及使用已存公钥计算的签名。
验证成功后再原子更新最近使用时间和风险信息,轮换会话标识并签发应用 session。Passkey 证明本次断言由某个凭据授权,不应被直接当成永久 API token。
原生应用必须证明域名关系
网站、iOS 和 Android 要共享同一账号凭据,RP ID 必须保持一致,并建立平台要求的安全关联。Apple 应用配置 webcredentials Associated Domain,网站通过 HTTPS 提供匹配应用标识的 apple-app-site-association。没有关联域名,应用不能代表该服务使用 Passkey。
Android 通过 Digital Asset Links 把网站与应用包名、签名证书关联,再使用 Credential Manager。服务端还要维护允许的 Android Origin,覆盖真实生产签名证书;调试证书不得混入生产允许列表。更换签名、域名或 CDN 规则前,应在已发布版本上验证关联文件,不能只在本机请求成功。
管理界面与恢复同样重要
账号设置应列出凭据的可辨认名称、提供商或设备提示、创建与最近使用时间,并允许新增、重命名和撤销。删除最后一个 Passkey 前明确提示剩余登录方式;新增凭据、删除凭据、修改恢复方式和退出其他会话都要求近期强认证,并向用户发送通知。
同步型 Passkey 能显著降低换机成本,但不等于永远不会丢失。用户可能失去凭据提供商账号、切换生态,或只使用不可同步的安全密钥。鼓励注册第二个独立凭据,并提供经过风险评估的恢复码、受信设备确认或人工身份核验。
恢复路径不能明显弱于 Passkey。若一封容易被接管的邮箱就能直接重置高价值账号,抗钓鱼登录只保护了正常路径。恢复后应撤销遗失凭据与高风险会话、通知原有渠道,并给安全敏感操作设置冷静期。
渐进替代而非突然移除密码
迁移期可以让 Passkey 与密码或联合登录共存,并在一次成功的旧方式登录后提示创建 Passkey。登录页面使用系统支持的条件式界面,让现有 Passkey 自然出现在账号输入流程,而不是要求用户先理解一种新术语。
用攻击路径验收
自动化测试至少覆盖 challenge 重放、过期和错配;错误 Origin 与 RP ID;缺失用户在场或用户验证标志;篡改签名;未知、重复与已撤销 credential;同一凭据并发使用;错误算法;账号合并与删除。生产探针还应定期检查 Apple 和 Android 关联文件。
上线前逐项确认:challenge 随机、短期、绑定意图且仅消费一次;服务端完整验证 Origin、RP ID、标志和签名;user handle 不含个人信息;账号支持多个凭据并有管理页面;iOS 与 Android 域名关联在生产签名下有效;恢复不弱化认证;旧登录方式按指标渐退;攻击与丢失路径均有真机证据。
Passkey 的价值来自一条完整信任链:平台保护私钥,域名关联限制凭据使用范围,服务端验证每次 ceremony,账号系统管理多份凭据,恢复流程在设备丢失时继续守住身份。任何一环只做演示级实现,都会把无密码体验变成新的账号接管入口。