lty/qy_lty/.planning/ROADMAP.md
pmc 9965d0bcf0 docs(03-02): 完成 Phase 3 Plan 03-02 + Milestone v1.0 收尾
- 03-02-SUMMARY.md 新建: AccessTokenMaskFilter + LOGGING + 修改记录条目落地, 9 truth × 32 项断言全 PASS, 2 处 Rule 1 auto-fix bug 文档化
- STATE.md 更新: 进度 100%, Phase 3 标记 Complete, Milestone v1.0 收尾, 决策日志补 [Plan 03-02] 7 条
- ROADMAP.md 更新: Milestone v1.0 标  完结, Phase 3 / Plan 03-01+03-02 全部 ✓
- REQUIREMENTS.md 更新: CRED-06 标记 Done, traceability 表 Phase 3 行 Done, 覆盖率 6/6 全 Done

Milestone v1.0「通用凭据槽位 (APP ID + Access Token)」CRED-01 至 CRED-06 全部交付完成。
2026-05-08 10:36:17 +08:00

81 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RoadmapQY LTY Backend
## 概览
本路线图聚焦 **Milestone v1.0「通用凭据槽位APP ID + Access Token」**:在后端落地一组全局单例的通用凭据存储槽位,让 Web 管理后台可写入、手机端 + 设备端可读取,且 Access Token 不会落入生产日志。粒度为 coarse3-5 phase按"数据层 → 管理端读写 → 客户端读取 + 日志脱敏"自下而上推进,三个 phase 串行依赖。
## Milestones
-**v1.0 通用凭据槽位** — Phase 1-3 全部交付2026-05-07 启动 / 2026-05-08 完结CRED-01 至 CRED-06 全 Done
## Phases
**Phase 编号说明:**
- 整数 phase1、2、3当期 milestone 计划工作
- 小数 phase2.1、2.2):紧急插入工作(标记 INSERTED
小数 phase 在数值序内夹在前后整数之间执行。
- [x] **Phase 1: 凭据槽位数据层** — 落地 `CredentialSlot` 单例模型 + 迁移 + Django Admin 注册(脱敏 + 隐藏新增按钮)✓ 2026-05-07 完成Plan 01-01 + 01-02
- [x] **Phase 2: 管理端读写接口** — 在 `/api/v1/admin/` 暴露凭据槽位 GET脱敏/ PUT覆写端点admin token 鉴权 ✓ 2026-05-07 完成Plan 02-01 + 02-02
- [x] **Phase 3: 客户端读取与日志脱敏** — 在 `/api/credential-slot/` 暴露明文读取端点user token 鉴权),并在阿里云日志链路过滤 `access_token` ✓ 2026-05-08 完成Plan 03-01 + 03-02
## Phase Details
### Phase 1: 凭据槽位数据层
**Goal**: 在数据库层落地全局单例的凭据槽位,并通过 Django Admin 提供受控录入入口(写入态可见、查看态脱敏、不可新增多条)
**Depends on**: Nothing首个 phase
**Requirements**: CRED-01, CRED-02
**Success Criteria**(必须为真):
1. 在 Django shell / Admin 中尝试创建第二条 `CredentialSlot` 记录会被 DB 层或模型层拒绝DB 中最多一条)
2. 运行 `python manage.py migrate`schema 中存在 `app_id``access_token``updated_at` 三个字段,且首次访问时通过 `get_or_create(pk=1)` 拿到一条空记录
3. 登录 Django AdminSimpleUI 主题)打开凭据槽位页面:列表态/查看态下 `access_token` 显示为脱敏掩码(仅末 4 位),编辑态下显示明文供运营录入
4. Admin 列表页**不显示**「新增」按钮(强制单例语义,避免运营误建第二条)
**Plans:** 2 plans
- [x] 01-01-PLAN.md — 凭据槽位单例模型 + 迁移 + mask_token 工具CRED-01✓ 2026-05-07 完成commits a9c25eb / 30c7caf / a475fe4
- [x] 01-02-PLAN.md — Django Admin 注册(脱敏/单例新增/禁删)+ 修改记录两条CRED-02✓ 2026-05-07 完成commits 653f057 / ddbcb7dTask 2 checkpoint 由 orchestrator Django test client 程序化验收 10/10 PASS
### Phase 2: 管理端读写接口
**Goal**: Web 管理后台qy-lty-admin能通过 `/api/v1/admin/credential-slot/` 读取脱敏后的凭据槽位、并以全字段覆写方式更新它
**Depends on**: Phase 1
**Requirements**: CRED-03, CRED-04
**Success Criteria**(必须为真):
1. 携带有效 `admin_token:{token}` 调用 `GET /api/v1/admin/credential-slot/`,返回 `{ success, code, message, data: { app_id, access_token: <masked>, updated_at } }`,其中 `access_token` 仅暴露末 4 位掩码
2. 携带有效 `admin_token:{token}` 调用 `PUT /api/v1/admin/credential-slot/` 提交 `{ app_id, access_token }`,记录被全字段覆写、`updated_at` 自动刷新;空记录场景自动 `get_or_create`,不报 404
3. 不携带 admin token、或仅携带普通 user token 调用上述两个端点均被拒绝401 / 403错误响应同样符合 `StandardResponseMiddleware` 壳层
4. 接口出现在 `/swagger/``/redoc/` 中,请求/响应 schema 与实际行为一致drf-yasg 自动生成)
**Plans:** 2 plans
- [x] 02-01-PLAN.md — CredentialSlot serializer + viewGET 脱敏 / PUT 覆写 + admin 二次校验)+ admin_urls 路由注册CRED-03 + CRED-04✓ 2026-05-07commits 6820fe7 / 192d0a1 / 9d02021
- [x] 02-02-PLAN.md — 端到端 curl + Django shell 验收 8 条 success criteria + qy_lty / qy-lty-admin 两端修改记录互引CRED-03 + CRED-04✓ 2026-05-07commits 3cfd481 / 46d72b8
### Phase 3: 客户端读取与日志脱敏
**Goal**: 手机端LTY_App_Project_URP和设备端LTY_Project能通过 `/api/credential-slot/` 拿到**明文** APP ID + Access Token 去调用第三方服务;同时确保 Access Token 在阿里云日志中始终脱敏,不论是 PUT 请求体还是管理端 GET 响应体
**Depends on**: Phase 2
**Requirements**: CRED-05, CRED-06
**Success Criteria**(必须为真):
1. 携带有效 `token:{token}` 调用 `GET /api/credential-slot/`,返回 `{ success, code, message, data: { app_id, access_token: <明文>, updated_at } }`Access Token 为明文(客户端实际调用第三方需要)
2. 不携带 user token、或携带过期 token 调用客户端端点均被 `RedisTokenAuthentication` 拒绝401错误响应符合标准壳层
3. 在生产日志(阿里云日志服务)中检索 Phase 2 / Phase 3 的请求轨迹:`PUT /api/v1/admin/credential-slot/` 请求体里的 `access_token` 字段被脱敏;管理端 `GET` 响应体里的 `access_token` 同样脱敏;客户端明文 GET 端点的响应体不写入日志(或同样脱敏),无任何位置暴露完整 Access Token 明文
4. 端到端验证:管理后台用 PUT 写入一组凭据 → 手机端调用客户端 GET 拿到的 `app_id` / `access_token` 与管理端写入的一致(往返一致性成立)
**Plans:** 2 plans
- [x] 03-01-PLAN.md — 客户端凭据槽位 GET 接口CRED-05CredentialSlotClientView 明文返回 + /api/credential-slot/ 路由注册)✓ 2026-05-08commits 5269a08 / 50dcf1c / a58980f
- [x] 03-02-PLAN.md — 阿里云日志 access_token 脱敏CRED-06AccessTokenMaskFilter + LOGGING 配置 + 修改记录)✓ 2026-05-08commits 891a5ea / 35eb110 / 7a9e511 / db4d5cf端到端 9 truth × 32 项断言全 PASS
## Progress
**执行顺序:**
Phase 按数值顺序执行1 → 2 → 3如出现紧急插入记为 1.1 / 2.1 等)
| Phase | Plans Complete | Status | Completed |
|-------|----------------|--------|-----------|
| 1. 凭据槽位数据层 | 2/2 | ✓ Complete | 2026-05-07 |
| 2. 管理端读写接口 | 2/2 | ✓ Complete | 2026-05-07 |
| 3. 客户端读取与日志脱敏 | 2/2 | ✓ Complete | 2026-05-08 |
**Milestone v1.0 总进度6/6 plans (100%) — 完结 ✓**
---
*生成时间2026-05-07Milestone v1.0「通用凭据槽位APP ID + Access Token」启动*
*最后更新2026-05-08Milestone v1.0 完结CRED-01 至 CRED-06 全部交付)*