与 AI Agent 对齐开发需求
码不停提
采用 Copilot GPT-5.2 Plan Agent 对项目需求进行分析并制定开发计划
码不停提
采用 Copilot GPT-5.2 Plan Agent 对项目需求进行分析并制定开发计划
准备用 Go 开发一个 TOTP 服务。这里是初步的需求,我目前已经把数据表建好了,你分析一下数据表结构和 README 中的需求,看能否按 dev-service.md 实现?
我先让子代理通读 README、需求文档和 SQL 表结构,找出是否能支撑需求、有哪些缺口/不一致,以及需要补哪些设计点;然后给你一份可落地的开发计划草案供你确认。
Review schema vs requirements
读取 totp/README.md
读取 totp/docs/dev-service.md
读取 totp/docs/sql/database.sql
现有表结构能覆盖“项目、终端用户标识、TOTP 凭据、调用日志、审计日志”的大框架,但有两处会阻断 README 的核心场景:project_user_credentials 的唯一约束导致同项目无法多用户、以及 project_id 类型不一致。先做一次“最小必要的 schema 修复 + 关键设计定型”(鉴权、密钥加密、ID 生成、审计策略),再按 dev-service.md 分阶段落地 Go 服务与两套 API 及对接文档。
project_user_credentials 约束与 project_id 类型一致性。X-Api-Key +(哈希比对 secret 或加密存储以支持 HMAC);后台用 token。open/admin 路由、storage、crypto、audit、logging。identifier_id 生成策略:A Snowflake/BIGINT B UUID(需改字段类型)。user_totp_credentials 表 vs 复用现有凭据表(需明确归属模型)。database.sql 文件,我修复了唯一键约束问题,也调整了 project_id 类型不一致的问题;
- 开放 API 的鉴权方式: 仅“key+secret 哈希比对”
- identifier_id 采用自增 id, 自增初始 id 设置为 10024;
- user_totp_credentials 和 现有的用户凭据表有什么区别吗?我理解的项目用户凭据表就是用户的 2FA 验证码生成凭据;
我会先让子代理读取你修改后的 schema,确认两处修复是否完整,并结合你的 3 个决策给出“是否还需要 user_totp_credentials”的结论与下一步落地建议。
Check updated schema + 2FA table reasoning
读取 totp/docs/sql/database.sql)
读取 totp/docs/sql/database.sql#140-140),行 140 到 140
读取 totp/docs/dev-service.md)
读取 totp/README.md)
你这三点决策都很合理;我这里补两点“需要确认/补齐”的关键点,并回答第 3 个问题。
HTTPS + IP 白名单 + 限流 + 审计告警。projects.api_key + projects.api_secret_hash 足够用;建议额外加 secret_rotated_at/secret_version(或以后抽 project_api_keys 表)来支持轮换。identifier_id 自增 + 起始值 10024AUTO_INCREMENT,并设置了起始值(例如表级 AUTO_INCREMENT=10024)。否则“你理解上是自增”,但落库仍可能不是。user_totp_credentials 和“项目用户凭据表”区别是什么?是否需要?project_user_credentials:面向“项目终端用户”的 2FA(开放 API 用),多租户隔离边界是 project_id,用户标识通常是项目内邮箱/手机号。user_totp_credentials:面向“后台/系统用户(users 表里的账号)”的 2FA(管理后台登录用),隔离边界是系统用户 users.id,权限更高、策略更严(强制 2FA、恢复流程、设备绑定等)。user_totp_credentials(或把 users.auth_id 改成能关联到某个现有凭据模型)。不建议直接复用 project_user_credentials 来承载后台 2FA,因为会引入 project_id 空值/虚拟项目、隔离边界变模糊,后续容易出越权与运维麻烦。你现在已经修复了“同项目多用户凭据”的唯一键和 project_id 类型不一致;下一步我建议你确认两件事:
project_user_identifiers.identifier_id 是否已按你的要求做成 AUTO_INCREMENT 且起始 10024;users.auth_id 这条“引用 user_totp_credentials”是否已同步修正(补表或改字段含义)。想让我给一版“最小变更 DDL 清单”(包含 user_totp_credentials 的推荐字段、以及自增起始值写法)供你直接贴到 database.sql 吗?
我已经修复了 identifier_id 自增的问题并更新了表结构; 采纳你的建议,新增一个 user_totp_credentials 表,补一版最小变量 DDL 清单
Inspect updated database.sql
搜索正则表达式 identifier_id|AUTO_INCREMENT|project_user_credentials|UNIQUE|project_id|api_call_logs|audit_logs|users|auth_id|totp|2fa (**/docs/sql/database.sql),55 个结果
读取 totp/docs/sql/database.sql)
读取 totp/docs/sql/database.sql#139-139),行 139 到 139
读取 totp/docs/sql/database.sql#139-139),行 139 到 139
在你已修复 identifier_id 自增与 project_user_credentials 约束后,下一步最小闭环是:新增一张“后台系统用户 2FA”凭据表,并把 users.auth_id 的引用关系定型(推荐用 user_id 单向关联,避免双向一致性问题);同时顺手把 api_call_logs.project_id 的有符号类型对齐,减少隐式转换与索引失效风险。
user_totp_credentials 表:包含 user_id、encrypted_secret、algorithm/digits/period、is_active、时间字段与必要索引。UNIQUE(user_id),保证“一名后台用户一套 2FA”(后续多设备再扩展)。user_totp_credentials.user_id -> users.id,按策略选 CASCADE 或 RESTRICT。users 的关联方案:推荐不再使用 users.auth_id,改由 user_totp_credentials.user_id 反查(如需兼容,先保留字段但停止写入)。api_call_logs.project_id 从 int 统一为 int unsigned;(可选)把 projects.user_id/created_by 对齐为 int unsigned。audit_logs 增加 (user_id, action_type, created_at) 与 (project_id, action_type, created_at) 以覆盖后台 2FA 事件查询。users 关联选型:A 保留并使用 auth_id(需改成 bigint unsigned,且易双向不一致)/ B 推荐仅用 user_totp_credentials.user_id。CASCADE(自动删 2FA) vs RESTRICT(必须先解绑 2FA)。(user_id, device_id) 替代 UNIQUE(user_id)。api_call_logs.project_id 类型对齐了;我把 users 中的 auth_id 去掉了; 2. 关于删除用户策略:系统不提供数据删除功能,不支持删除用户,只支持将用户状态修改为禁用; 3. 先不考虑多设备问题,用户通过 Google Authenticator 绑定二步验证码,我应该拿不到设备 id 吧;
Update plan based on new decisions
读取 totp/docs/sql/database.sql)
搜索正则表达式 audit|log|totp|2fa|mfa|google|authenticator|device|user_totp|credential (**/docs/sql/database.sql),23 个结果
你已完成两项关键对齐:api_call_logs.project_id 类型统一、并移除了 users.auth_id。接下来最小闭环就是新增“后台系统用户 2FA”凭据表,用 user_id -> users.id 单向关联;由于系统不做删除,仅做禁用,因此外键无需级联删除,凭据/用户都用 status/is_active 控制。多设备暂不做时,不需要也拿不到 Google Authenticator 的 device id。
user_totp_credentials:以 user_id 关联 users.id(后台用户 2FA)。UNIQUE(user_id),实现“一名后台用户一套 2FA”。user_totp_credentials.user_id -> users.id,使用 RESTRICT/NO ACTION(不走删除)。encrypted_secret、backup_codes_encrypted、algorithm/digits/period、is_active、last_used_at、created_at/updated_at。audit_logs 索引以支持后台 2FA 事件查询。users.status 与 user_totp_credentials.is_active 控制可用性。credential_id/label 来区分。ADMIN_2FA_BIND/UNBIND/VERIFY_SUCCESS/VERIFY_FAIL、ADMIN_LOGIN_SUCCESS/FAIL,并为常用查询加索引如 (user_id, action_type, created_at)。目前需求已对齐,接下来就开始执行开发了。
暂无目录