# 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) - [x] 创建 `packages/module-custom-world` 交付物:[../server-rs/packages/module-custom-world/README.md](../server-rs/packages/module-custom-world/README.md) - [x] 创建 `packages/module-assets` 交付物:[../server-rs/packages/module-assets/README.md](../server-rs/packages/module-assets/README.md) - [x] 创建 `packages/module-ai` 交付物:[../server-rs/packages/module-ai/README.md](../server-rs/packages/module-ai/README.md) - [x] 创建 `packages/shared-contracts` 交付物:[../server-rs/packages/shared-contracts/README.md](../server-rs/packages/shared-contracts/README.md) - [x] 创建 `packages/shared-kernel` 交付物:[../server-rs/packages/shared-kernel/README.md](../server-rs/packages/shared-kernel/README.md) - [x] 创建 `packages/platform-auth` 交付物:[../server-rs/packages/platform-auth/README.md](../server-rs/packages/platform-auth/README.md) - [x] 创建 `packages/platform-oss` 交付物:[../server-rs/packages/platform-oss/README.md](../server-rs/packages/platform-oss/README.md) - [x] 创建 `packages/platform-llm` 交付物:[../server-rs/packages/platform-llm/README.md](../server-rs/packages/platform-llm/README.md) - [x] 创建 `packages/spacetime-client` 交付物:[../server-rs/packages/spacetime-client/README.md](../server-rs/packages/spacetime-client/README.md) - [x] 创建 `packages/tests-support` 交付物:[../server-rs/packages/tests-support/README.md](../server-rs/packages/tests-support/README.md) ### Axum 基础能力 - [x] 搭建 `main.rs` / `Router` / `with_state` 交付物:[../server-rs/apps/api-server/src/main.rs](../server-rs/apps/api-server/src/main.rs) - [x] 接入统一配置加载 交付物:[../server-rs/apps/api-server/src/config.rs](../server-rs/apps/api-server/src/config.rs) - [x] 接入统一日志与 tracing 交付物:[../server-rs/apps/api-server/src/logging.rs](../server-rs/apps/api-server/src/logging.rs)、[../server-rs/apps/api-server/src/app.rs](../server-rs/apps/api-server/src/app.rs)、[../server-rs/apps/api-server/src/main.rs](../server-rs/apps/api-server/src/main.rs) - [x] 接入 `request_id` 中间件 交付物:[../server-rs/apps/api-server/src/request_context.rs](../server-rs/apps/api-server/src/request_context.rs)、[../server-rs/apps/api-server/src/app.rs](../server-rs/apps/api-server/src/app.rs) - [x] 接入统一错误处理中间件 交付物:[../server-rs/apps/api-server/src/http_error.rs](../server-rs/apps/api-server/src/http_error.rs)、[../server-rs/apps/api-server/src/error_middleware.rs](../server-rs/apps/api-server/src/error_middleware.rs)、[../server-rs/apps/api-server/src/app.rs](../server-rs/apps/api-server/src/app.rs) - [x] 接入当前项目兼容的 response envelope 交付物:[../server-rs/apps/api-server/src/api_response.rs](../server-rs/apps/api-server/src/api_response.rs)、[../server-rs/apps/api-server/src/request_context.rs](../server-rs/apps/api-server/src/request_context.rs)、[../server-rs/apps/api-server/src/http_error.rs](../server-rs/apps/api-server/src/http_error.rs) - [x] 接入 `x-request-id` 交付物:[../server-rs/apps/api-server/src/response_headers.rs](../server-rs/apps/api-server/src/response_headers.rs)、[../server-rs/apps/api-server/src/app.rs](../server-rs/apps/api-server/src/app.rs) - [x] 接入 `x-api-version` 交付物:[../server-rs/apps/api-server/src/response_headers.rs](../server-rs/apps/api-server/src/response_headers.rs) - [x] 接入 `x-route-version` 交付物:[../server-rs/apps/api-server/src/response_headers.rs](../server-rs/apps/api-server/src/response_headers.rs) - [x] 接入 `x-response-time-ms` 交付物:[../server-rs/apps/api-server/src/response_headers.rs](../server-rs/apps/api-server/src/response_headers.rs)、[../server-rs/apps/api-server/src/request_context.rs](../server-rs/apps/api-server/src/request_context.rs) - [x] 实现 `/healthz` 交付物:[../server-rs/apps/api-server/src/health.rs](../server-rs/apps/api-server/src/health.rs)、[../server-rs/apps/api-server/src/app.rs](../server-rs/apps/api-server/src/app.rs) ### 基础工程脚本 - [x] 新增本地开发脚本 交付物:[../server-rs/scripts/dev.ps1](../server-rs/scripts/dev.ps1)、[../server-rs/scripts/dev.sh](../server-rs/scripts/dev.sh) - [x] 新增测试脚本 交付物:[../server-rs/scripts/test.ps1](../server-rs/scripts/test.ps1)、[../server-rs/scripts/test.sh](../server-rs/scripts/test.sh) - [x] 新增 lint / fmt / clippy / check 脚本 交付物:[../server-rs/scripts/check.ps1](../server-rs/scripts/check.ps1)、[../server-rs/scripts/check.sh](../server-rs/scripts/check.sh) - [x] 新增 smoke 脚本 交付物:[../server-rs/scripts/smoke.ps1](../server-rs/scripts/smoke.ps1)、[../server-rs/scripts/smoke.sh](../server-rs/scripts/smoke.sh) - [x] 新增 SpacetimeDB 本地开发脚本 交付物:[../server-rs/scripts/spacetime-dev.ps1](../server-rs/scripts/spacetime-dev.ps1)、[../server-rs/scripts/spacetime-dev.sh](../server-rs/scripts/spacetime-dev.sh) ### 阶段验收 - [x] Axum 服务可独立启动 证据:`./server-rs/scripts/smoke.ps1` 已通过,覆盖临时启动 `api-server`、等待 `/healthz` 就绪并验证 raw / envelope 协议。 - [x] `/healthz` 返回与当前工程兼容 - [x] 基础 response envelope 与 request id 行为稳定 证据:`cargo test -p api-server --manifest-path server-rs/Cargo.toml` 已通过,覆盖 envelope 协商与 `/healthz` 头部回写。 - [x] Rust workspace 能完整编译通过 证据:`cargo check -p api-server --manifest-path server-rs/Cargo.toml` 已通过。 ## M2:鉴权、会话、JWT 与 refresh cookie ### SpacetimeDB 身份表 - [x] 设计 `user_account` 交付物:[../docs/technical/SPACETIMEDB_AUTH_USER_ACCOUNT_TABLE_DESIGN_2026-04-21.md](../docs/technical/SPACETIMEDB_AUTH_USER_ACCOUNT_TABLE_DESIGN_2026-04-21.md) - [x] 设计 `auth_identity` 交付物:[../docs/technical/SPACETIMEDB_AUTH_IDENTITY_TABLE_DESIGN_2026-04-21.md](../docs/technical/SPACETIMEDB_AUTH_IDENTITY_TABLE_DESIGN_2026-04-21.md) - [x] 设计 `refresh_session` 交付物:[../docs/technical/SPACETIMEDB_REFRESH_SESSION_TABLE_DESIGN_2026-04-21.md](../docs/technical/SPACETIMEDB_REFRESH_SESSION_TABLE_DESIGN_2026-04-21.md) - [x] 设计 `auth_audit_log` 交付物:[../docs/technical/SPACETIMEDB_AUTH_AUDIT_LOG_TABLE_DESIGN_2026-04-21.md](../docs/technical/SPACETIMEDB_AUTH_AUDIT_LOG_TABLE_DESIGN_2026-04-21.md) - [x] 设计 `auth_risk_block` 交付物:[../docs/technical/SPACETIMEDB_AUTH_RISK_BLOCK_TABLE_DESIGN_2026-04-21.md](../docs/technical/SPACETIMEDB_AUTH_RISK_BLOCK_TABLE_DESIGN_2026-04-21.md) - [ ] 设计 `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 回归