feat: 交付用户 API Key 生命周期与 Portal 页面 #42

Closed
opened 2026-08-24 12:01:51 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:需求
  • 所属 Epic:#3
  • 所属 MVP / 版本:#35 / MVP-2
  • 阶段:已完成

原始需求

  • 来源:用户对话与已验收 #36/#37
  • 提出时间:2026-08-24
  • 脱敏摘要:面向现有受控用户交付安全的 API Key、OpenAPI 生成接口、限流、审计和必要管理页面;不开放注册、不自动删除数据、不增加计费或每日配额。

设计与原型门禁

  • 修改类型:生产实现
  • 已确认技术设计:Wiki Architecture-and-Code-Map,revision 1e8fea6c058d6d23f4a40183dd51708c8a4dae84
  • 已确认原型:prototypes/37/v1/index.html,#37 revision b65c47e5f701f67a8a06972e4f3e02c1f7bbd554
  • 状态:已确认(用户,2026-08-24)

依赖与并行

  • 前置工单:#41
  • 是否允许并行:前置完成后可与 OpenAPI 基础并行。

要解决什么

按 #37 v1 为现有登录用户交付 API Key 列表、创建一次显示、改名和幂等撤销的 Portal API 与页面。

做什么 / 不做什么

  • 做:session + CSRF 下的 GET/POST/PATCH/DELETE /api/api-keys;创建响应 no-store;完整 Key 只显示一次;加载/空/错误/限流/撤销状态;响应式和可访问性回归。
  • 不做:公开注册、管理员代创建、完整 Key 再次查看、程序 Bearer 认证、计费或每日配额。

子项目影响

  • 影响:portal 与 portal web 资源;依赖 #41 核心契约。
  • 不修改管理员认证或生成业务状态机。

验收标准

  • 用户只能管理自己的 Key,CSRF/越权/停用用户行为有测试。
  • 完整 Key 仅创建成功一次显示,刷新、列表和错误均不恢复。
  • 页面符合 prototypes/37/v1 的主要流程、状态和响应式边界。
  • Portal Go 测试、前端构建与浏览器关键流程通过。

文档影响

  • 已更新 Wiki 的 Architecture-and-Code-Map、Business-Rules-and-Glossary、Local-Development-and-Verification,并同步核心镜像。

风险和回退

错误缓存或重复回显会泄密;创建响应必须 no-store,日志和错误不得包含完整 Key。回退只移除入口,不自动删除已创建 Key。

实施结果(2026-08-24)

  • 提交:b12721b(已推送 origin/main)。
  • Portal 新增会话认证的 API Key 列表、创建、改名、幂等撤销 API 和页面;写操作要求 CSRF,所有 Key 响应禁止缓存。
  • 完整 token 只在创建响应中返回;数据库仅保存 hash 和前缀,页面确认保存后清除 token DOM,列表和刷新均不能恢复。
  • 用户作用域、active 状态与修改在同一事务校验;跨用户返回 404,停用用户返回 403。
  • 文档 revisions:Architecture 92ed37aff92d1f54fd18a8aac4f15835b8082251;Business Rules 1bdd0adffefbf1fbb33ddfdab777e2f27e6aef83;Local Verification 71cf8fd56b2a18494d380464f59fc58d81283bd9。

验证结果(2026-08-24)

  • go test ./...、go vet ./...、go build ./...:通过。
  • go -C admin test ./...、go -C admin build .:通过。
  • pnpm --dir portal/web build:通过。
  • 可丢弃 MySQL 8 隔离库:迁移回归、Portal Handler/API Key 仓储与安全边界集成测试通过。
  • Playwright 四视口 API Key 流程 4/4 通过;完整 Portal 套件 9 通过、3 个按既有视口条件跳过。
  • python dev_scripts/harness.py check --strict、42 项 Harness 单测、sync --check、git diff --check:通过。
  • 未调用真实 Provider,未使用当前服务数据库;#42 不包含 OpenAPI Bearer、请求限流或审计,它们由后续 MVP-2 单元工单交付。

验收确认

  • 2026-08-24:用户明确确认验收通过。
  • 任务归档 revision:d478f1da8df6920926ef45755e6e66729de8a436。
## 基本信息 - 类型:需求 - 所属 Epic:#3 - 所属 MVP / 版本:#35 / MVP-2 - 阶段:已完成 ## 原始需求 - 来源:用户对话与已验收 #36/#37 - 提出时间:2026-08-24 - 脱敏摘要:面向现有受控用户交付安全的 API Key、OpenAPI 生成接口、限流、审计和必要管理页面;不开放注册、不自动删除数据、不增加计费或每日配额。 ## 设计与原型门禁 - 修改类型:生产实现 - 已确认技术设计:Wiki Architecture-and-Code-Map,revision `1e8fea6c058d6d23f4a40183dd51708c8a4dae84` - 已确认原型:`prototypes/37/v1/index.html`,#37 revision `b65c47e5f701f67a8a06972e4f3e02c1f7bbd554` - 状态:已确认(用户,2026-08-24) ## 依赖与并行 - 前置工单:#41 - 是否允许并行:前置完成后可与 OpenAPI 基础并行。 ## 要解决什么 按 #37 v1 为现有登录用户交付 API Key 列表、创建一次显示、改名和幂等撤销的 Portal API 与页面。 ## 做什么 / 不做什么 - 做:session + CSRF 下的 GET/POST/PATCH/DELETE /api/api-keys;创建响应 no-store;完整 Key 只显示一次;加载/空/错误/限流/撤销状态;响应式和可访问性回归。 - 不做:公开注册、管理员代创建、完整 Key 再次查看、程序 Bearer 认证、计费或每日配额。 ## 子项目影响 - 影响:portal 与 portal web 资源;依赖 #41 核心契约。 - 不修改管理员认证或生成业务状态机。 ## 验收标准 - [x] 用户只能管理自己的 Key,CSRF/越权/停用用户行为有测试。 - [x] 完整 Key 仅创建成功一次显示,刷新、列表和错误均不恢复。 - [x] 页面符合 prototypes/37/v1 的主要流程、状态和响应式边界。 - [x] Portal Go 测试、前端构建与浏览器关键流程通过。 ## 文档影响 - [x] 已更新 Wiki 的 Architecture-and-Code-Map、Business-Rules-and-Glossary、Local-Development-and-Verification,并同步核心镜像。 ## 风险和回退 错误缓存或重复回显会泄密;创建响应必须 no-store,日志和错误不得包含完整 Key。回退只移除入口,不自动删除已创建 Key。 ## 实施结果(2026-08-24) - 提交:`b12721b`(已推送 `origin/main`)。 - Portal 新增会话认证的 API Key 列表、创建、改名、幂等撤销 API 和页面;写操作要求 CSRF,所有 Key 响应禁止缓存。 - 完整 token 只在创建响应中返回;数据库仅保存 hash 和前缀,页面确认保存后清除 token DOM,列表和刷新均不能恢复。 - 用户作用域、active 状态与修改在同一事务校验;跨用户返回 404,停用用户返回 403。 - 文档 revisions:Architecture `92ed37aff92d1f54fd18a8aac4f15835b8082251`;Business Rules `1bdd0adffefbf1fbb33ddfdab777e2f27e6aef83`;Local Verification `71cf8fd56b2a18494d380464f59fc58d81283bd9`。 ## 验证结果(2026-08-24) - `go test ./...`、`go vet ./...`、`go build ./...`:通过。 - `go -C admin test ./...`、`go -C admin build .`:通过。 - `pnpm --dir portal/web build`:通过。 - 可丢弃 MySQL 8 隔离库:迁移回归、Portal Handler/API Key 仓储与安全边界集成测试通过。 - Playwright 四视口 API Key 流程 4/4 通过;完整 Portal 套件 9 通过、3 个按既有视口条件跳过。 - `python dev_scripts/harness.py check --strict`、42 项 Harness 单测、`sync --check`、`git diff --check`:通过。 - 未调用真实 Provider,未使用当前服务数据库;#42 不包含 OpenAPI Bearer、请求限流或审计,它们由后续 MVP-2 单元工单交付。 ## 验收确认 - 2026-08-24:用户明确确认验收通过。 - 任务归档 revision:`d478f1da8df6920926ef45755e6e66729de8a436`。
ila changed title from feat: 交付用户 API Key 生命周期与 Portal 页面 to feat: ???? API Key ????? Portal ?? 2026-08-24 14:56:12 +08:00
ila changed title from feat: ???? API Key ????? Portal ?? to feat: 交付用户 API Key 生命周期与 Portal 页面 2026-08-24 14:57:03 +08:00
Author
Owner

#42 已完成生产实现并进入待验收。

工单保持开启,等待用户验收。

#42 已完成生产实现并进入待验收。 - 实现提交:`b12721b`(已推送 `origin/main`) - 任务归档:https://git.ilapage.cn/OPC/chorus/wiki/Task-42-%E7%94%A8%E6%88%B7-API-Key-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E-Portal-%E9%A1%B5%E9%9D%A2.- - 归档 revision:`e59b195513c3e3d68c227dfe36cf7c824628084b` - 核心 Wiki 镜像:`sync --check` 通过 - 完整 token 仅创建时返回;数据库只存 hash;列表/刷新不回显;跨用户、停用账户和 CSRF 已由 MySQL 集成测试覆盖。 - 四视口 API Key 浏览器流程通过;未调用真实 Provider,未使用当前服务数据库。 工单保持开启,等待用户验收。
ila closed this issue 2026-08-24 15:08:42 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#42