Appearance
结论(TL;DR)
完全可以做到无需记密码:
- 新用户直接走 Passkey-first 注册(JIT 建号 + 可发现凭据),之后一直用通行密钥登录;
- 老用户用一次无密码迁移(邮件魔法链接/短信一次码/现场已登录会话)来绑定通行密钥,以后也不需要密码。
- 密码只作为备用恢复方式(可选),而不是每天都要输入的“主入口”。
两类用户路径(推荐落地)
A. 新用户:Passkey-first(彻底无密码)
- 登录页主按钮:「继续使用通行密钥」(启用 Conditional UI/Autofill)。
- 后端
generateRegistrationOptions:residentKey:'required',requireUserVerification:true,JIT 创建 pending 账户。 verifyRegistrationResponse成功后:签发登录态 → 引导补资料/绑定手机号或邮箱。- 以后登录:generateAuthenticationOptions(不传 allowCredentials) 即可无用户名直登。
这样用户从未设置过密码,也无需记忆。
B. 老用户:无密码迁移 → 绑定 Passkey
给用户三个等价入口,任选其一完成一次性绑定:
- 魔法链接:输入邮箱 → 收链接 → 点击即登录 → 立刻提示「一键绑定通行密钥」。
- 一次性验证码:输入邮箱/手机号 → 填 6 位码 → 立刻提示绑定。
- 已登录会话:若用户已在某设备登录,直接在安全设置页提示「添加通行密钥」。
绑定完成后,该账号后续登录都走 passkey,无需再输入密码。
账号恢复与“丢钥匙”预案(关键,否则体验会反噬)
要求首绑就注册两把钥匙(例如手机 + 电脑)。
允许多把通行密钥(硬件 Key、手机、电脑各一),并提供命名/吊销。
备用通道(只用于恢复,不作为日常登录):
- 魔法链接 / 一次性验证码;
- 恢复码(一次性使用,生成后提示妥善保管);
- 管理员人工恢复(适用于员工场景,配风控核验)。
敏感操作“升级验证”:资金/权限变更时强制使用 passkey + 已登录会话 或二次生物验证。
你的后端(NestJS + simplewebauthn)最小改造清单
遵循你的偏好:只列关键改动点,不贴整段代码。
注册/登录都要求 UV(强用户验证) 在
verifyRegistrationResponse与verifyAuthenticationResponse里将requireUserVerification: true(你当前是false)。 // 复杂逻辑:确保是“人手持有设备”在操作,符合 passkey 设计初衷保留你现有的 JIT 建号(你已经实现 ✅) 首次注册直接创建 pending 员工 → 验证成功即激活/赋最小权限。
新增「无密码迁移」两条辅助路由
POST /auth/magic-link/start:写入一次性 token(Redis TTL),发邮件链接。GET /auth/magic-link/callback:消费 token → 创建会话 → 立刻发generateRegistrationOptions让用户绑定通行密钥。 // 复杂逻辑:仅首次绑定使用;成功后引导多设备再绑定一把
允许一个账号绑定多把凭据 你的
passkey_credentials表已支持多行(同subjectId多credentialId)。补充:昵称、创建时间、最后使用时间、来源设备。风控/限流 已有 Redis 限流基础上,给魔法链接/验证码也做:同邮箱 5 次/小时、同 IP 20 次/小时。
设备唯一(若你业务需要) 不把“设备唯一”当身份学前置条件;而是绑定成功后在业务授权层做限制(例如一机一号白名单),避免与 passkey 的“跨设备同步”理念冲突。
前端 UX 要点(极大影响转化)
- 登录页优先级:「继续使用通行密钥」(主按钮) 下面一行较轻样式提供「其他方式」→ 魔法链接 / 一次性码。
- 启用 Conditional UI/Autofill(浏览器/系统会自动弹 Passkey 选择器)。
- 首次绑定成功后,显式提示**「再添加一把通行密钥以防手机丢失」**。
- 设置页提供**「查看/重命名/移除」**通行密钥列表。
方案权衡与常见问答
- 必须先注册吗? 是。至少要有一次把该账户的公钥写入你库里,后续才能凭签名登录。
- 可以不设密码吗? 完全可以。密码变成备用恢复手段(可选),而非日常入口。
- 没有 Passkey 的设备怎么登录? 魔法链接/一次性码仅作为救场;登录后立刻提示绑定。
- 安全性会不会下降? 不会——前提是日常登录只走 passkey,而恢复通道加限流/风控,并鼓励多设备多把钥匙。
一页落地清单(供你排期)
- 登录页改版:主入口 Passkey,次入口 魔法链接/一次码。
- 后端把
requireUserVerification改为 true(注册 & 登录)。 - 新增魔法链接两条路由 + Redis TTL/限流。
- 设置页支持多把凭据的增删改查(带最后使用时间)。
- 首绑后强提示添加第二把。
- 文案与支持:加入**“如何恢复账号”**帮助页。
小结
你完全可以提供**“从第一天起就不需要记密码、也不必再输密码”**的体验:
- 新用户走 Passkey-first;
- 老用户用一次性无密码手段完成绑定;
- 以后所有登录都用通行密钥;
- 通过多把钥匙 + 恢复通道 + 风控,把“忘记密码”的痛点与“丢设备”的风险同时解决。