feat: add WeChat session authentication
This commit is contained in:
@@ -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`。
|
||||
|
||||
Reference in New Issue
Block a user