我写过的每个项目计划里都有一条:"认证——2天。"
每个项目回顾里都有一条备注:"认证花了2周。"
我已经构建过4次认证系统。每一次,我都低估了它。以下是原因,以及我最终学到的教训。
冰山一角
你以为的认证:
- 登录表单
- 存储令牌
- 检查令牌是否有效
- 完成
实际的认证:
- 登录表单(邮箱/密码 + OAuth + 魔法链接 + 多因素认证?)
- 密码哈希(bcrypt、argon2,成本因子选多少?)
- 会话管理(JWT vs 会话cookie vs 两者都用?)
- 令牌刷新(静默刷新、轮换、撤销)
- CSRF防护(同站cookie、双重提交令牌)
- 速率限制(登录、注册、密码重置)
- 密码重置流程(令牌生成、过期、单次使用)
- 邮箱验证(令牌、重新发送逻辑、更换邮箱怎么办?)
- 账户锁定(尝试次数?解锁流程是什么?)
- 基于角色的访问(管理员 vs 用户 vs 版主)
- API密钥管理(用于程序化访问)
- 密码变更时会话失效
- "记住我" vs "仅本次会话"
- 新设备登录通知
- 审计日志(谁登录、何时、从何处)
以上是15+个功能。每个1-2天,加起来就是一个月。
我现在怎么做:使用Supabase Auth并扩展
在两次自建认证系统并痛不欲生之后,我现在从Supabase Auth(或Clerk、Auth.js)开始。它处理:
- 邮箱/密码(使用bcrypt)
- OAuth提供商(Google、GitHub、Discord)
- 带刷新的JWT令牌
- 邮箱验证
- 密码重置
- 会话管理
- 速率限制
这覆盖了80%的认证需求,由全职思考认证的人来处理。我专注于那20%与我应用相关的部分:
