feat: add WeChat session authentication

This commit is contained in:
2026-07-20 14:47:16 +08:00
parent 2ada52f35a
commit 67d29d3ca0
26 changed files with 1289 additions and 130 deletions

View File

@@ -1,6 +1,16 @@
# 微信登录与教师身份实施方案
本文用于把当前客户端可伪造的固定 `X-User-Id`,替换为“微信身份换取后端会话”的正式登录体系。完成前不应公开发布小程序。
本文记录已经实现的“微信身份换取后端会话”体系,以及部署和旧数据迁移步骤。完成生产配置与双账号验收前不应公开发布小程序。
## 当前状态
代码已实现数据库迁移、微信换码接口、随机会话令牌、统一 Bearer 鉴权、小程序自动登录与单次重试,以及旧用户归属迁移命令。部署时仍需完成:
1. 在 5700U 的 `server/.env` 填写 `WECHAT_APP_ID``WECHAT_APP_SECRET`
2. 重建镜像并运行数据库迁移。
3. 使用目标微信账号首次登录,记录“我的”页面显示的新内部 UUID。
4. 备份数据库后运行 `migrate-user-owner`,把旧开发 UUID 数据交给该账号。
5. 使用两个微信账号验证数据隔离,确认生产 `ALLOW_DEVELOPMENT_USER_HEADER=false`
## 目标流程
@@ -66,7 +76,7 @@ auth_sessions
处理要求:
1. 校验 code 非空并限制长度登录频率。
1. 校验 code 非空并限制长度;进程内最多同时执行 8 个微信换码请求,反向代理仍应按来源限制登录频率。
2. Rust 使用 `WECHAT_APP_ID``WECHAT_APP_SECRET` 调用 `code2Session`
3. 微信返回错误码、缺少 `openid` 或网络失败时返回明确的 `401`/`502`,日志不得记录 AppSecret、session_key 或完整 code。
4.`(app_id, openid)` 原子地查找或创建本地用户。
@@ -131,10 +141,13 @@ ALLOW_DEVELOPMENT_USER_HEADER=false
不能把这些数据自动交给“部署后第一个登录的人”,否则存在抢占风险。采用一次性管理命令迁移:
1. 先发布微信登录功能,由目标微信账号完成一次登录并取得新的内部用户 UUID。
2. 在服务端运行受控 CLI,例如
2. 在服务端运行受控 CLI
```text
migrate-user-owner --from 5a4da7f0-d70c-465f-bcab-124c504aa9f0 --to <新用户UUID>
docker compose -f compose.deploy.yml run --rm --no-deps api \
migrate-user-owner \
--from 5a4da7f0-d70c-465f-bcab-124c504aa9f0 \
--to <新用户UUID>
```
3. CLI 在单个数据库事务中更新学生档案、预设、反馈记录和反馈会话的 `owner_id`