结论
第一版不要自研复杂认证。Supabase Auth 或 Clerk 都能满足邮箱登录与常见第三方登录。

什么时候该接入认证
只要产品存在下面任意一种场景,就该尽早把登录系统接上:
- 需要保存用户数据,例如草稿、收藏、项目配置。
- 需要区分游客和付费用户。
- 需要记录操作历史,或者让用户在多设备之间同步状态。
- 需要给不同用户展示不同内容。
很多独立开发者会把认证拖到后面,因为它看起来不像核心功能。但实际情况正好相反。认证一旦晚接入,后面通常要补三件事:数据库结构、页面跳转、权限判断。越往后补,返工越多。
先选方案
第一版最实用的判断标准不是“谁最强”,而是“谁最少阻塞上线”。
| 方案 | 适合场景 | 代价 |
|---|---|---|
| Supabase Auth | 已经用 Supabase 数据库,想少写代码 | 配置项较多,但整体一致性好 |
| Clerk | 更重视开箱即用和 UI 组件 | 成本通常更高,平台耦合更强 |
| Auth.js | 想完全掌控流程 | 需要自己处理更多边界 |
如果你的产品已经把数据放在 Supabase,优先选 Supabase Auth。原因很直接:用户表、RLS、Session、Server Component 读取用户态,都在同一套体系里。
推荐接入顺序
1. 先把登录页跑通
不要一上来就做复杂注册流程。先确认最小路径:
- 用户输入邮箱和密码。
- 系统创建账号或登录账号。
- 页面跳转到
/auth/callback。 - 服务器写入登录态 Cookie。
- 页面刷新后能读到当前用户。
2. 再处理数据库权限
认证成功不等于数据安全。你还需要做两件事:
- 在业务表里保存
user_id。 - 给表开启 RLS,让用户只能访问自己的数据。
没有这一步,登录只是“能进来”,不是“能安全地进来”。
3. 最后补体验
等主流程稳定后,再做这些增强项:
- 注册成功后的欢迎邮件。
- 密码重置。
- 第三方登录。
- 头像、昵称和个人资料页。
最容易踩的坑
回调地址配错
很多问题都卡在 Redirect URL。你要区分两个地址:
- Google 或其他 OAuth 先回到 Supabase 的 callback。
- Supabase 再跳回你网站自己的
/auth/callback。
只做前端登录,没做服务端会话
如果只是浏览器里拿到用户对象,但服务端页面读不到登录态,刷新后就会掉线。原因通常是 cookie 没写对,或者 callback 没处理好。
只建表,不开 RLS
这会让你的认证看起来“能用”,但安全性不完整。真正上线前,业务表都应该有自己的访问策略。
一个更稳的落地方式
我建议把认证拆成三层:
- 认证层:Supabase Auth 负责登录与会话。
- 数据层:业务表保存用户自己的数据。
- 权限层:RLS 控制谁能读写什么。
这样做的好处是,后面你换前端框架、换页面结构,认证逻辑也不容易散掉。
验证标准
完成后,至少检查下面 4 件事:
- 注册后能收到邮件。
- 登录后页面刷新不会丢失登录态。
- 数据库里能看到对应用户记录。
- 退出登录后,受保护页面会回到未登录状态。