# Auth + Profile(Supabase 优先)设计 **Date:** 2026-02-24 **Status:** Approved ## 目标 在最大化复用 Supabase Auth 能力前提下,完成以下能力: 1. 用户注册:`username + email + password` 2. 用户登录:`email + password` 3. 用户按 email 查询(Auth 维度) 4. 用户资料更新(Profile 维度) ## 范围与原则 - 保留并复用现有 `/auth/signup`、`/auth/login`、`/profile/me` 主体能力 - 仅补齐差距,不重复造轮子 - 登录标识仅使用 email,`username` 仅用于展示 - `profiles.username` 允许重复,不加唯一约束 - 当前为开发阶段,按“无历史数据”处理迁移 ## 数据模型设计 `public.profiles` 字段调整: - 保留:`id`, `username`, `avatar_url`, `bio`, `created_at`, `updated_at`, `deleted_at` - 删除:`display_name` - `id` 继续绑定 `auth.users.id`(FK + ON DELETE CASCADE) ## 认证与资料流转 ### 注册 - 请求:`username + email + password` - 后端调用 Supabase `auth.sign_up`,并将 `username` 写入 `raw_user_meta_data.username` - 由数据库触发器在 `auth.users` 插入后自动创建 `public.profiles` - `profiles.id = auth.users.id` - `profiles.username = raw_user_meta_data.username` ### 登录 - 保持现有 `email + password` 登录,不改协议 ### 按 email 查找用户 - 新增后端接口:`GET /auth/users/by-email?email=...` - 通过 Supabase Admin 能力查询(后端 service_role) - 返回最小必要字段(例如 `id/email/created_at/email_confirmed_at`) ### 资料更新 - `PATCH /profile/me` 继续使用 - 去除 `display_name` 更新项 - 允许更新:`username/avatar_url/bio` ## 安全与权限 - 按 email 查找接口必须后端受控,避免普通用户枚举 - 注册与更新时做输入校验(格式、长度) - 认证继续依赖 Supabase 签发 token,后端负责业务鉴权 ## 验收标准 1. 注册时提交 `username+email+password` 可成功创建 Auth 用户 2. 注册后自动创建 profile,且 `profiles.username` 等于注册时 `username` 3. 登录保持 `email+password` 可用 4. `PATCH /profile/me` 可更新 `username/avatar_url/bio` 5. `GET /auth/users/by-email` 返回正确用户或 404 6. `profiles` 表无 `display_name` 字段