重写
This commit is contained in:
@@ -181,28 +181,34 @@
|
||||
### 手机验证码登录
|
||||
|
||||
- [ ] 接入阿里云短信发送 adapter
|
||||
- [ ] 实现发送验证码接口
|
||||
- [ ] 实现验证码校验接口
|
||||
- [ ] 实现手机号绑定
|
||||
- [x] 实现发送验证码接口
|
||||
交付物:[../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md)、[../docs/technical/PHONE_AUTH_AXUM_RATE_LIMIT_AND_FAILURE_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_RATE_LIMIT_AND_FAILURE_DESIGN_2026-04-21.md)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)、[../server-rs/crates/api-server/src/phone_auth.rs](../server-rs/crates/api-server/src/phone_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)
|
||||
- [x] 实现验证码校验接口
|
||||
交付物:[../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md)、[../docs/technical/PHONE_AUTH_AXUM_RATE_LIMIT_AND_FAILURE_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_RATE_LIMIT_AND_FAILURE_DESIGN_2026-04-21.md)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)、[../server-rs/crates/api-server/src/phone_auth.rs](../server-rs/crates/api-server/src/phone_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)
|
||||
- [x] 实现手机号绑定
|
||||
交付物:[../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md)、[../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md](../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)、[../server-rs/crates/api-server/src/wechat_auth.rs](../server-rs/crates/api-server/src/wechat_auth.rs)
|
||||
- [ ] 实现手机号换绑
|
||||
- [ ] 实现发送频率限制
|
||||
- [ ] 实现验证码失败次数限制
|
||||
- [x] 实现发送频率限制
|
||||
交付物:[../docs/technical/PHONE_AUTH_AXUM_RATE_LIMIT_AND_FAILURE_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_RATE_LIMIT_AND_FAILURE_DESIGN_2026-04-21.md)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)、[../server-rs/crates/api-server/src/phone_auth.rs](../server-rs/crates/api-server/src/phone_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)
|
||||
- [x] 实现验证码失败次数限制
|
||||
交付物:[../docs/technical/PHONE_AUTH_AXUM_RATE_LIMIT_AND_FAILURE_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_RATE_LIMIT_AND_FAILURE_DESIGN_2026-04-21.md)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)、[../server-rs/crates/api-server/src/phone_auth.rs](../server-rs/crates/api-server/src/phone_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)
|
||||
- [ ] 实现 captcha 触发逻辑
|
||||
- [ ] 实现风控封禁与解除
|
||||
|
||||
### 微信登录
|
||||
|
||||
当前执行策略:
|
||||
|
||||
1. 微信登录链路自 `2026-04-21` 起暂缓执行,不进入当前连续落地顺序。
|
||||
2. 相关设计文档继续保留,后续如恢复执行再单独解锁。
|
||||
|
||||
- [ ] 接入微信 OAuth adapter
|
||||
- [ ] 实现 `wechat/start`
|
||||
- [ ] 实现 `wechat/callback`
|
||||
- [ ] 实现微信身份绑定
|
||||
- [ ] 实现微信账号补绑手机号
|
||||
- [ ] 实现桌面端 / 微信内打开场景区分
|
||||
- [x] 接入微信 OAuth adapter
|
||||
交付物:[../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md](../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md)、[../server-rs/crates/api-server/src/wechat_provider.rs](../server-rs/crates/api-server/src/wechat_provider.rs)、[../server-rs/crates/api-server/src/state.rs](../server-rs/crates/api-server/src/state.rs)
|
||||
- [x] 实现 `wechat/start`
|
||||
交付物:[../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md](../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md)、[../server-rs/crates/api-server/src/wechat_auth.rs](../server-rs/crates/api-server/src/wechat_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)
|
||||
- [x] 实现 `wechat/callback`
|
||||
交付物:[../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md](../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md)、[../server-rs/crates/api-server/src/wechat_auth.rs](../server-rs/crates/api-server/src/wechat_auth.rs)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)
|
||||
- [x] 实现微信身份绑定
|
||||
交付物:[../docs/technical/SPACETIMEDB_AUTH_IDENTITY_TABLE_DESIGN_2026-04-21.md](../docs/technical/SPACETIMEDB_AUTH_IDENTITY_TABLE_DESIGN_2026-04-21.md)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)
|
||||
- [x] 实现微信账号补绑手机号
|
||||
交付物:[../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md](../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md)、[../server-rs/crates/api-server/src/wechat_auth.rs](../server-rs/crates/api-server/src/wechat_auth.rs)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)
|
||||
- [x] 实现桌面端 / 微信内打开场景区分
|
||||
交付物:[../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md](../docs/technical/WECHAT_LOGIN_AXUM_IMPLEMENTATION_DESIGN_2026-04-21.md)、[../server-rs/crates/api-server/src/wechat_auth.rs](../server-rs/crates/api-server/src/wechat_auth.rs)、[../server-rs/crates/api-server/src/session_client.rs](../server-rs/crates/api-server/src/session_client.rs)
|
||||
|
||||
### OIDC 与 SpacetimeDB 身份透传
|
||||
|
||||
@@ -235,12 +241,17 @@
|
||||
- [ ] 兼容 `/api/auth/audit-logs`
|
||||
- [ ] 兼容 `/api/auth/risk-blocks`
|
||||
- [ ] 兼容 `/api/auth/risk-blocks/:scopeType/lift`
|
||||
- [ ] 兼容 `/api/auth/phone/send-code`
|
||||
- [ ] 兼容 `/api/auth/phone/login`
|
||||
- [x] 兼容 `/api/auth/phone/send-code`
|
||||
交付物:[../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md)、[../server-rs/crates/api-server/src/phone_auth.rs](../server-rs/crates/api-server/src/phone_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)
|
||||
- [x] 兼容 `/api/auth/phone/login`
|
||||
交付物:[../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md](../docs/technical/PHONE_AUTH_AXUM_MINIMAL_FLOW_DESIGN_2026-04-21.md)、[../server-rs/crates/api-server/src/phone_auth.rs](../server-rs/crates/api-server/src/phone_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)、[../server-rs/crates/module-auth/src/lib.rs](../server-rs/crates/module-auth/src/lib.rs)
|
||||
- [ ] 兼容 `/api/auth/phone/change`
|
||||
- [ ] 兼容 `/api/auth/wechat/start`
|
||||
- [ ] 兼容 `/api/auth/wechat/callback`
|
||||
- [ ] 兼容 `/api/auth/wechat/bind-phone`
|
||||
- [x] 兼容 `/api/auth/wechat/start`
|
||||
交付物:[../server-rs/crates/api-server/src/wechat_auth.rs](../server-rs/crates/api-server/src/wechat_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)、[../src/services/authService.ts](../src/services/authService.ts)
|
||||
- [x] 兼容 `/api/auth/wechat/callback`
|
||||
交付物:[../server-rs/crates/api-server/src/wechat_auth.rs](../server-rs/crates/api-server/src/wechat_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)、[../src/services/authService.ts](../src/services/authService.ts)
|
||||
- [x] 兼容 `/api/auth/wechat/bind-phone`
|
||||
交付物:[../server-rs/crates/api-server/src/wechat_auth.rs](../server-rs/crates/api-server/src/wechat_auth.rs)、[../server-rs/crates/api-server/src/app.rs](../server-rs/crates/api-server/src/app.rs)、[../src/services/authService.ts](../src/services/authService.ts)
|
||||
|
||||
### 阶段验收
|
||||
|
||||
@@ -248,7 +259,8 @@
|
||||
证据:`cargo test -p module-auth --manifest-path server-rs/Cargo.toml`、`cargo test -p api-server --manifest-path server-rs/Cargo.toml` 已通过,覆盖自动建号、重复登录复用、错密码 `401`、非法用户名 `400` 与 refresh cookie 写回。
|
||||
- [x] refresh cookie 主链可用
|
||||
证据:`cargo test -p module-auth --manifest-path server-rs/Cargo.toml`、`cargo test -p api-server --manifest-path server-rs/Cargo.toml` 已通过,覆盖 refresh 成功轮换、旧 token 失效、缺少 cookie `401` 与失败时清理 cookie。
|
||||
- [ ] 手机验证码主链可用
|
||||
- [ ] 微信登录主链可用
|
||||
说明:当前按“暂缓执行”处理,不作为当前连续阶段的阻塞项。
|
||||
- [ ] 所有旧鉴权接口可通过 contract 回归
|
||||
- [x] 手机验证码主链可用
|
||||
证据:`cargo test -p module-auth phone --manifest-path server-rs/Cargo.toml -- --nocapture`、`cargo test -p api-server phone --manifest-path server-rs/Cargo.toml -- --nocapture` 已通过,覆盖发送验证码、同场景冷却 `429`、验证码错误次数耗尽 `429`、重新发送后恢复登录,以及手机号登录建号/复用与 refresh cookie 写回。
|
||||
- [x] 微信登录主链可用
|
||||
证据:`cargo test -p api-server --manifest-path server-rs/Cargo.toml`、`cargo test -p api-server wechat --manifest-path server-rs/Cargo.toml`、`cargo test -p module-auth --manifest-path server-rs/Cargo.toml` 已通过,覆盖 `wechat/start`、`wechat/callback`、待绑定会话签发、手机号补绑并入已有账号,以及 `unionid` 命中后新 `openid` 映射回写。
|
||||
- [ ] 所有旧鉴权接口可通过 contract 回归
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
- [x] 设计对象键前缀
|
||||
- [x] 设计 `object_key -> cdn_url` 解析策略
|
||||
- [x] 设计 public / private 对象访问策略
|
||||
- [ ] 设计签名 URL 输出策略
|
||||
- [x] 设计签名 URL 输出策略
|
||||
- [x] 设计 `x-oss-meta-*` 元数据规范
|
||||
- [ ] 设计内容 hash / 版本字段规范
|
||||
|
||||
## 2. 上传与对象确认
|
||||
|
||||
- [x] 实现浏览器 `PostObject` 直传签名接口
|
||||
- [ ] 实现 STS 临时授权接口
|
||||
- [ ] 实现服务端上传 helper
|
||||
- [ ] 实现上传完成后的对象确认接口
|
||||
- [ ] 实现对象绑定业务实体 reducer
|
||||
- [x] 实现 STS 临时授权接口
|
||||
- [x] 实现服务端上传 helper
|
||||
- [x] 实现上传完成后的对象确认接口
|
||||
- [x] 实现对象绑定业务实体 reducer
|
||||
|
||||
补充说明:
|
||||
|
||||
@@ -29,20 +29,41 @@
|
||||
2. 当前已在 `server-rs/crates/platform-oss` 与 `server-rs/crates/api-server` 落下最小可用链路:
|
||||
- `PostObject` 直传签名能力
|
||||
- `/api/assets/direct-upload-tickets`
|
||||
- `/api/assets/objects/confirm`
|
||||
- 兼容旧 `/generated-*` 前缀的对象键规划
|
||||
- `.env/.env.local` 的 OSS 环境变量加载
|
||||
3. 当前仍未进入 `STS`、服务端上传 helper、对象确认与 `SpacetimeDB` 绑定阶段。
|
||||
- 服务端 `HEAD Object` 校验
|
||||
- `asset_object` 确认真实 SpacetimeDB 持久化
|
||||
- `/api/assets/objects/bind`
|
||||
- `asset_entity_binding` 业务实体槽位绑定
|
||||
- `/api/assets/sts-upload-credentials` 禁用式 contract
|
||||
- 服务端 `PutObject` 上传 helper
|
||||
3. 当前 bucket 已明确为私有读写;后续正式存储口径改为 `bucket + object_key` 双列,不再把匿名公开 URL 当成真相。
|
||||
4. 当前 STS 接口按“服务器上传、Web 只下载”的需求固定为 `403` 禁用式 contract,不向浏览器下发 OSS 写权限。
|
||||
5. `2026-04-21` 已通过 live test 验证:真实 OSS 上传后,`/api/assets/objects/confirm` 能把 `xushi-dev + object_key` 写入本地 `genarrative-dev.asset_object`,并可继续通过 `/api/assets/objects/bind` 绑定到业务实体槽位。
|
||||
|
||||
## 3. 资产任务系统
|
||||
|
||||
- [ ] 设计 `asset_job`
|
||||
- [ ] 设计 `asset_object`
|
||||
- [x] 设计 `asset_object`
|
||||
- [ ] 设计 `asset_manifest`
|
||||
- [ ] 设计 `character_visual_asset`
|
||||
- [ ] 设计 `character_animation_asset`
|
||||
- [ ] 设计 `scene_image_asset`
|
||||
- [ ] 设计 `sprite_sheet_asset`
|
||||
|
||||
补充说明:
|
||||
|
||||
1. `asset_object` 当前已冻结核心存储口径为:
|
||||
- `bucket`
|
||||
- `object_key`
|
||||
2. 详细设计见:
|
||||
- [../docs/technical/SPACETIMEDB_ASSET_OBJECT_STORAGE_DESIGN_2026-04-21.md](../docs/technical/SPACETIMEDB_ASSET_OBJECT_STORAGE_DESIGN_2026-04-21.md)
|
||||
- [../docs/technical/SPACETIMEDB_ASSET_OBJECT_TABLE_DESIGN_2026-04-21.md](../docs/technical/SPACETIMEDB_ASSET_OBJECT_TABLE_DESIGN_2026-04-21.md)
|
||||
- [../docs/technical/ASSET_OBJECT_CONFIRM_FLOW_DESIGN_2026-04-21.md](../docs/technical/ASSET_OBJECT_CONFIRM_FLOW_DESIGN_2026-04-21.md)
|
||||
- [../docs/technical/M6_OSS_SERVER_UPLOAD_AND_STS_POLICY_2026-04-21.md](../docs/technical/M6_OSS_SERVER_UPLOAD_AND_STS_POLICY_2026-04-21.md)
|
||||
3. 当前已在 `server-rs/crates/spacetime-module` 落下 `asset_object` 首版表骨架,并完成 `api-server -> SpacetimeDB` 的最小对象确认闭环。
|
||||
|
||||
## 4. 资产生成链路
|
||||
|
||||
- [ ] 迁移角色主形象生成
|
||||
@@ -82,6 +103,8 @@
|
||||
- [ ] 兼容 `/api/assets/qwen-sprite/save`
|
||||
## 7. 阶段验收
|
||||
|
||||
- [x] OSS 直传对象可被服务端确认并写入 `asset_object`
|
||||
- [ ] 所有新生成资产都写入 OSS
|
||||
- [ ] 前端仍能通过旧路径习惯访问资源
|
||||
- [ ] 资产任务状态可查询
|
||||
- [x] 已确认对象可绑定到业务实体槽位
|
||||
|
||||
Reference in New Issue
Block a user