Page:
Task-42-用户-API-Key-生命周期与-Portal-页面
Pages
Architecture-and-Code-Map
Audience-Document-Template
Business-Rules-and-Glossary
Common-Changes
Delivery-Documentation-Guide
Deployment-Template
Deployment-and-Operations
Development-Workflow
Existing-Project-Adoption-Guide
Home
Local-Development-and-Verification
New-Project-Documentation-Setup
Product-Requirements-Overview
Project-Profile
Task-1-完善技术基线与实施约束
Task-10-实现-Provider-协议、mock-上游与内嵌-worker
Task-11-实现-portal-认证、异步提交与鉴权查询
Task-12-按确认原型实现-portal-用户界面
Task-13-完成-MVP-0-集成验收与运行闭环
Task-14-增加-Windows-本地开发启动脚本
Task-15-将现有-worker-接入-portal-运行与优雅退出
Task-16-明确-MVP-1-路由与-Provider-技术设计
Task-17-制作-MVP-1-管理端运营原型
Task-18-制作-MVP-1-用户端增强原型
Task-19-MVP-1-多上游可用性与运营管理
Task-2-制作-MVP-0-用户端生成页原型
Task-20-MVP-1-可逆迁移与-admin-基线
Task-21-MVP-1-路由核心与故障转移
Task-22-MVP-1-多-Provider-协议安全调用与-Worker-原子尝试
Task-23-MVP-1-管理端-API、凭据轮换与连通性审计
Task-24-go-admin-MVP-1-运营界面
Task-25-MVP-1-portal-提交契约与游标历史
Task-26-MVP-1-portal-用户界面
Task-27-MVP-1-集成验收
Task-28-安全管理员-bootstrap-命令
Task-29-管理端改为账号密码登录
Task-30-Provider-API-Key-明文存储与回显变更
Task-31-完全移除用户点数展示与需求
Task-32-移除-admin-ui-残留验证码登录交互
Task-33-修复-admin-ui-生产构建-runtime-资源缺失
Task-34-修复-admin-ui-SCSS-变量导入生产白屏
Task-36-MVP-2-API治理技术设计
Task-37-MVP-2-API-Key页面原型
Task-38-统一本地服务启停
Task-39-Supervisor-托管本地服务
Task-4-MVP-0-单上游安全异步生成闭环
Task-40-修复管理端动态菜单视图路径
Task-41-MVP-2-数据迁移与-API-Key-核心能力
Task-42-用户-API-Key-生命周期与-Portal-页面
Task-43-OpenAPI-v1-认证与生成接口
Task-44-实现三维限流与生成队列延后
Task-45-实现-API-安全审计与管理端-API
Task-46-交付管理端-API-Key-治理页面
Task-47-执行-MVP-2-跨模块集成验收
Task-48-简化单人开发工作流
Task-5-准备-MVP-0-可复现开发与测试环境
Task-50-用户端仅账号密码登录
Task-51-终端用户密码最小长度调整为-6-位
Task-52-规范化管理端-API-Key-幂等撤销时间响应
Task-53-修复-MVP-2-Portal-E2E-审计数据清理顺序
Task-55-Provider-出站端口白名单配置
Task-56-Portal-YAML-运行配置
Task-58-图片生成-300-秒受控复验
Task-59-管理端分组导航与适用系统模块原型
Task-6-初始化-Go-项目骨架与可逆数据库迁移
Task-60-??-images_edits-??????.-
Task-60-对齐-images_edits-图片编辑协议.-
Task-61-修正生成尝试状态展示
Task-65-完善生成记录耗时和时间展示
Task-66-建立管理端四分组菜单与权限-migration
Task-67-适配管理端系统-API-与管理员保护
Task-68-实现四分组导航与系统管理页面
Task-69-管理端系统模块集成与安全回归
Task-7-实现核心领域模型、状态规则和-Prompt-渲染
Task-8-实现-SSRF-安全-HTTP、AES-GCM-密钥信封和受保护本地存储
Task-9-实现-MySQL-8-SKIP-LOCKED-租约队列、attempt-原子记录和最终-CAS
Task-Archive-Template
Troubleshooting
unnamed
Clone
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.
42 用户 API Key 生命周期与 Portal 页面
- 类型:需求
- 所属 Epic:#3
- 所属 MVP / 版本:#35 / MVP-2
- 状态:已完成
- 日期:2026-08-24
- Gitea 工单:#42
- Wiki 页面:Task-42-用户-API-Key-生命周期与-Portal-页面
- Wiki revision:以线上页面
last_commit.sha为准
背景与目标
面向现有受控登录用户交付 API Key 的自助生命周期管理:查看自己的 Key、创建并仅一次取得完整 token、修改名称和不可恢复地撤销。继续保持不开放注册、不引入计费、点数、每日配额和管理员代管的边界。
最终方案
- 在 Portal 增加
/api-keys页面,以及会话认证的列表、创建、改名和撤销 JSON API;写操作沿用 CSRF,页面和响应统一禁止缓存。 - Service 在事务内锁定并确认终端用户为 active,所有仓储操作同时约束
user_id。跨用户资源按不存在处理,停用用户拒绝管理。 - 使用安全随机源创建凭据;数据库仅保存 public id、前缀和 secret hash。完整 token 只放入创建成功响应,用户确认保存后从 DOM 清除,列表和刷新无法恢复。
- 页面覆盖加载、空、错误、停用、限流、一次展示、改名和撤销状态;桌面使用紧凑表格,移动端使用行卡片,交互目标至少 44px。
- API Key 的 OpenAPI Bearer 认证、请求限流和审计不在本工单实现,继续由 MVP-2 后续单元工单交付。
修改文件
portal/service/api_keys.go、internal/core/apikey/repository.go:生命周期服务、active 用户事务门禁和 Unicode 名称校验。portal/handler/api_keys.go、portal/handler/router.go:页面与 API 路由、CSRF、严格 JSON 和 no-store 响应。portal/web/templates/api_keys.html、portal/web/static/api-keys.js、相关 CSS/Icon:完整 Portal 页面和响应式交互。portal/handler/mysql_integration_test.go、portal/service/api_keys_test.go、portal/web/e2e/*:服务、真实 MySQL Handler 和四视口浏览器回归。- Wiki Architecture、Business Rules、Local Verification 及其
docs/核心镜像:记录长期架构、业务规则和验证方式。
验收结果
| 验收标准 | 结果 |
|---|---|
| 用户只能管理自己的 Key,覆盖 CSRF、越权和停用用户 | 通过 |
| 完整 Key 只在创建成功时显示一次,刷新和列表不能恢复 | 通过 |
| 页面符合已确认原型的主要流程、状态和响应式边界 | 通过 |
| Portal Go 测试、前端构建和浏览器关键流程 | 通过 |
| 人工业务验收 | 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,OpenAPI Bearer、限流和审计不属于 #42。
遗留问题
#42 范围内无已知遗留缺陷。OpenAPI Bearer、限流和审计按 MVP-2 后续工单推进。
相关提交
b12721bfeat: 交付用户 API Key 生命周期 (#42)
验收确认
- 2026-08-24:用户明确确认 #42 验收通过。