# M0 ~ M2:基础设施与鉴权任务清单 ## M0:冻结能力与重写边界 ### 能力冻结 - [x] 整理当前后端 6 个挂载面并锁定为重写验收基线 交付物:[M0_CAPABILITY_SURFACE_BASELINE_2026-04-20.md](./M0_CAPABILITY_SURFACE_BASELINE_2026-04-20.md) - [x] 整理当前后端 96 条路由并生成一份“旧接口 -> 新实现”映射表 交付物:[M0_ROUTE_MIGRATION_MATRIX_2026-04-20.md](./M0_ROUTE_MIGRATION_MATRIX_2026-04-20.md) - [x] 整理当前 12 个内部模块并锁定迁移归属 交付物:[M0_MODULE_MIGRATION_BASELINE_2026-04-20.md](./M0_MODULE_MIGRATION_BASELINE_2026-04-20.md) - [x] 整理当前所有 SSE 接口与事件格式 交付物:[M0_SSE_INTERFACE_BASELINE_2026-04-20.md](./M0_SSE_INTERFACE_BASELINE_2026-04-20.md) - [x] 整理当前所有 `/generated-*` 静态资源前缀 交付物:[M0_GENERATED_STATIC_PREFIX_BASELINE_2026-04-20.md](./M0_GENERATED_STATIC_PREFIX_BASELINE_2026-04-20.md) - [x] 整理当前前端直接依赖的响应头、envelope、错误格式 交付物:[M0_FRONTEND_RESPONSE_CONTRACT_BASELINE_2026-04-20.md](./M0_FRONTEND_RESPONSE_CONTRACT_BASELINE_2026-04-20.md) ### 仓库边界 - [x] 确认 Rust 后端新目录名与根目录落位方案 交付物:[M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md](./M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md) - [x] 确认旧 `server-node/` 在迁移期继续保留,不提前删除 交付物:[M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md](./M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md) - [x] 确认前端第一阶段仍然只访问 Axum,不直连 SpacetimeDB 交付物:[M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md](./M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md) - [x] 确认外部副作用统一收口在 Axum,不放进 SpacetimeDB 模块 交付物:[M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md](./M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md) ### 交付物 - [x] 新增“接口映射表”文档 交付物:[M0_ROUTE_MIGRATION_MATRIX_2026-04-20.md](./M0_ROUTE_MIGRATION_MATRIX_2026-04-20.md) - [x] 新增“模块迁移清单”文档 交付物:[M0_MODULE_MIGRATION_BASELINE_2026-04-20.md](./M0_MODULE_MIGRATION_BASELINE_2026-04-20.md) - [x] 新增“阶段验收矩阵”文档 交付物:[M0_PHASE_ACCEPTANCE_MATRIX_2026-04-20.md](./M0_PHASE_ACCEPTANCE_MATRIX_2026-04-20.md) ## M1:Rust 工作区与 Axum 基础设施 ### 工作区搭建 - [x] 在根目录新增 `server-rs/` 交付物:[../server-rs/README.md](../server-rs/README.md) - [x] 创建 workspace `Cargo.toml` 交付物:[../server-rs/Cargo.toml](../server-rs/Cargo.toml) - [x] 创建 `apps/api-server` 交付物:[../server-rs/apps/api-server/README.md](../server-rs/apps/api-server/README.md) - [x] 创建 `apps/spacetime-module` 交付物:[../server-rs/apps/spacetime-module/README.md](../server-rs/apps/spacetime-module/README.md) - [x] 创建 `packages/module-auth` 交付物:[../server-rs/packages/module-auth/README.md](../server-rs/packages/module-auth/README.md) - [x] 创建 `packages/module-runtime` 交付物:[../server-rs/packages/module-runtime/README.md](../server-rs/packages/module-runtime/README.md) - [x] 创建 `packages/module-story` 交付物:[../server-rs/packages/module-story/README.md](../server-rs/packages/module-story/README.md) - [x] 创建 `packages/module-combat` 交付物:[../server-rs/packages/module-combat/README.md](../server-rs/packages/module-combat/README.md) - [x] 创建 `packages/module-inventory` 交付物:[../server-rs/packages/module-inventory/README.md](../server-rs/packages/module-inventory/README.md) - [x] 创建 `packages/module-npc` 交付物:[../server-rs/packages/module-npc/README.md](../server-rs/packages/module-npc/README.md) - [x] 创建 `packages/module-progression` 交付物:[../server-rs/packages/module-progression/README.md](../server-rs/packages/module-progression/README.md) - [x] 创建 `packages/module-quest` 交付物:[../server-rs/packages/module-quest/README.md](../server-rs/packages/module-quest/README.md) - [x] 创建 `packages/module-runtime-item` 交付物:[../server-rs/packages/module-runtime-item/README.md](../server-rs/packages/module-runtime-item/README.md) - [ ] 创建 `packages/module-custom-world` - [ ] 创建 `packages/module-assets` - [ ] 创建 `packages/module-editor` - [ ] 创建 `packages/module-ai` - [ ] 创建 `packages/shared-contracts` - [ ] 创建 `packages/shared-kernel` - [ ] 创建 `packages/platform-auth` - [ ] 创建 `packages/platform-oss` - [ ] 创建 `packages/platform-llm` - [ ] 创建 `packages/spacetime-client` - [ ] 创建 `packages/tests-support` ### Axum 基础能力 - [ ] 搭建 `main.rs` / `Router` / `with_state` - [ ] 接入统一配置加载 - [ ] 接入统一日志与 tracing - [ ] 接入 `request_id` 中间件 - [ ] 接入统一错误处理中间件 - [ ] 接入当前项目兼容的 response envelope - [ ] 接入 `x-request-id` - [ ] 接入 `x-api-version` - [ ] 接入 `x-route-version` - [ ] 接入 `x-response-time-ms` - [ ] 实现 `/healthz` ### 基础工程脚本 - [ ] 新增本地开发脚本 - [ ] 新增测试脚本 - [ ] 新增 lint / fmt / clippy / check 脚本 - [ ] 新增 smoke 脚本 - [ ] 新增 SpacetimeDB 本地开发脚本 ### 阶段验收 - [ ] Axum 服务可独立启动 - [ ] `/healthz` 返回与当前工程兼容 - [ ] 基础 response envelope 与 request id 行为稳定 - [ ] Rust workspace 能完整编译通过 ## M2:鉴权、会话、JWT 与 refresh cookie ### SpacetimeDB 身份表 - [ ] 设计 `user_account` - [ ] 设计 `auth_identity` - [ ] 设计 `refresh_session` - [ ] 设计 `auth_audit_log` - [ ] 设计 `auth_risk_block` - [ ] 设计 `sms_auth_event` - [ ] 设计 `wechat_auth_state` ### Axum 鉴权服务 - [ ] 实现密码登录 - [ ] 实现账号自动创建 / 幂等登录兼容策略 - [ ] 实现 Bearer JWT 校验 - [ ] 实现 refresh cookie 读取 - [ ] 实现 refresh token 轮换 - [ ] 实现会话吊销 - [ ] 实现全端登出 - [ ] 实现 `me` 查询 ### 手机验证码登录 - [ ] 接入阿里云短信发送 adapter - [ ] 实现发送验证码接口 - [ ] 实现验证码校验接口 - [ ] 实现手机号绑定 - [ ] 实现手机号换绑 - [ ] 实现发送频率限制 - [ ] 实现验证码失败次数限制 - [ ] 实现 captcha 触发逻辑 - [ ] 实现风控封禁与解除 ### 微信登录 - [ ] 接入微信 OAuth adapter - [ ] 实现 `wechat/start` - [ ] 实现 `wechat/callback` - [ ] 实现微信身份绑定 - [ ] 实现微信账号补绑手机号 - [ ] 实现桌面端 / 微信内打开场景区分 ### OIDC 与 SpacetimeDB 身份透传 - [ ] 设计 JWT claims - [ ] 确认 `iss/sub/sid/provider/roles` 字段 - [ ] 让 Axum 自身可校验 JWT - [ ] 让 SpacetimeDB 可识别 Axum 签发的身份令牌 - [ ] 验证 reducer / view 可读取用户身份上下文 ### 当前接口兼容 - [ ] 兼容 `/api/auth/login-options` - [ ] 兼容 `/api/auth/entry` - [ ] 兼容 `/api/auth/me` - [ ] 兼容 `/api/auth/logout` - [ ] 兼容 `/api/auth/logout-all` - [ ] 兼容 `/api/auth/refresh` - [ ] 兼容 `/api/auth/sessions` - [ ] 兼容 `/api/auth/sessions/:sessionId/revoke` - [ ] 兼容 `/api/auth/audit-logs` - [ ] 兼容 `/api/auth/risk-blocks` - [ ] 兼容 `/api/auth/risk-blocks/:scopeType/lift` - [ ] 兼容 `/api/auth/phone/send-code` - [ ] 兼容 `/api/auth/phone/login` - [ ] 兼容 `/api/auth/phone/change` - [ ] 兼容 `/api/auth/wechat/start` - [ ] 兼容 `/api/auth/wechat/callback` - [ ] 兼容 `/api/auth/wechat/bind-phone` ### 阶段验收 - [ ] 密码登录主链可用 - [ ] refresh cookie 主链可用 - [ ] 手机验证码主链可用 - [ ] 微信登录主链可用 - [ ] 所有旧鉴权接口可通过 contract 回归