feat: add wechat miniprogram webview login

This commit is contained in:
2026-05-03 19:05:45 +08:00
parent 9baa515a75
commit ce98a29c4d
17 changed files with 758 additions and 42 deletions

View File

@@ -92,6 +92,25 @@
2. 若是并入已有手机号正式账号,则返回目标正式账号快照,当前实现会保持其账号主登录方式,例如 `loginMethod = phone`
3. 但 access token 中的 `provider` 仍按**本次登录来源**签发,不依赖账号主登录方式推断,因此微信绑定后的当前会话仍会签发 `provider = wechat`
### 3.4 `POST /api/auth/wechat/miniprogram-login`
职责固定为:
1. 接收微信小程序原生壳通过 `wx.login` 拿到的 `code`
2.`Axum` 内调用微信 `jscode2session`,兑换 `openid/unionid`
3. 复用 `resolve_login` 处理 `unionid/openid -> user_id` 的查找、补写和待绑定账号创建。
4. 签发本系统 access token并创建 refresh session。
5. 返回:
- `token`
- `bindingStatus`
- `user`
关键约束:
1. 小程序壳不能把裸 `openid` 直接拼给 H5 做登录。
2. H5 仍只消费本系统 `auth_token`,小程序壳只是把这枚 token 放入既有 hash 回调格式。
3. 小程序请求必须补传 `x-client-type=mini_program``x-client-runtime=wechat_mini_program`,用于 refresh session 记录来源。
## 4. 当前最小实现策略
当前阶段为了先打通 Rust 后端闭环,采用以下最小实现:
@@ -125,6 +144,7 @@
4. `GET /api/auth/wechat/start`
5. `GET /api/auth/wechat/callback`
6. `POST /api/auth/wechat/bind-phone`
7. `POST /api/auth/wechat/miniprogram-login`
## 6. 环境变量
@@ -139,11 +159,14 @@
7. `WECHAT_AUTHORIZE_ENDPOINT`
8. `WECHAT_ACCESS_TOKEN_ENDPOINT`
9. `WECHAT_USER_INFO_ENDPOINT`
10. `WECHAT_STATE_TTL_MINUTES`
11. `WECHAT_MOCK_USER_ID`
12. `WECHAT_MOCK_UNION_ID`
13. `WECHAT_MOCK_DISPLAY_NAME`
14. `WECHAT_MOCK_AVATAR_URL`
10. `WECHAT_JS_CODE_SESSION_ENDPOINT`
11. `WECHAT_MINI_PROGRAM_APP_ID`
12. `WECHAT_MINI_PROGRAM_APP_SECRET`
13. `WECHAT_STATE_TTL_MINUTES`
14. `WECHAT_MOCK_USER_ID`
15. `WECHAT_MOCK_UNION_ID`
16. `WECHAT_MOCK_DISPLAY_NAME`
17. `WECHAT_MOCK_AVATAR_URL`
## 7. 与后续 SpacetimeDB 的衔接要求