首页 / 技术分享 / 自建 TOTP 微服务 /
与 AI Agent 对齐开发需求

与 AI Agent 对齐开发需求

码不停提

2026-01-29
33 次浏览
0 条评论

采用 Copilot GPT-5.2 Plan Agent 对项目需求进行分析并制定开发计划

自建 TOTP 微服务
TOTP
Copilot
GPT-5.2
分享:

准备用 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

Plan: TOTP 服务需求与表结构对齐

现有表结构能覆盖“项目、终端用户标识、TOTP 凭据、调用日志、审计日志”的大框架,但有两处会阻断 README 的核心场景:project_user_credentials 的唯一约束导致同项目无法多用户、以及 project_id 类型不一致。先做一次“最小必要的 schema 修复 + 关键设计定型”(鉴权、密钥加密、ID 生成、审计策略),再按 dev-service.md 分阶段落地 Go 服务与两套 API 及对接文档。

Steps

  1. 对齐需求映射与数据模型差距,基于 README.md 和 dev-service.md 输出确认清单。
  2. 修复表结构阻断点:调整 database.sql 中 project_user_credentials 约束与 project_id 类型一致性。
  3. 定型关键安全/鉴权:开放 API 用 X-Api-Key +(哈希比对 secret 或加密存储以支持 HMAC);后台用 token。
  4. 在 service 设计 Go 项目骨架与模块边界:open/admin 路由、storagecryptoauditlogging
  5. 逐步实现开放 API 与后台 API:用户创建/绑定、二维码、验证、禁用;项目/用户/审计/统计管理。
  6. 编写两套文档:开放 API 文档含 PHP 示例;后台 API 对接文档可直接指导前端/另一个 AI 集成。

Further Considerations

  1. 开放 API 鉴权选型:A 仅“key+secret 哈希比对” B “HMAC 签名(需加密存储 secret)”。
  2. identifier_id 生成策略:A Snowflake/BIGINT B UUID(需改字段类型)。
  3. 系统用户 2FA:补 user_totp_credentials 表 vs 复用现有凭据表(需明确归属模型)。

database.sql 文件,我修复了唯一键约束问题,也调整了 project_id 类型不一致的问题;

  1. 开放 API 的鉴权方式: 仅“key+secret 哈希比对”
  2. identifier_id 采用自增 id, 自增初始 id 设置为 10024;
  3. 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 个问题。

  1. 开放 API 鉴权:仅 key+secret 哈希比对
  • 可行,但它本质是“共享密钥明文传输后做 verify”,安全性强依赖 HTTPS + IP 白名单 + 限流 + 审计告警
  • 表结构层面 projects.api_key + projects.api_secret_hash 足够用;建议额外加 secret_rotated_at/secret_version(或以后抽 project_api_keys 表)来支持轮换。
  1. identifier_id 自增 + 起始值 10024
  • 自增完全没问题,但要确保你在建表 SQL 里真的写了 AUTO_INCREMENT,并设置了起始值(例如表级 AUTO_INCREMENT=10024)。否则“你理解上是自增”,但落库仍可能不是。
  1. user_totp_credentials 和“项目用户凭据表”区别是什么?是否需要?
  • project_user_credentials:面向“项目终端用户”的 2FA(开放 API 用),多租户隔离边界是 project_id,用户标识通常是项目内邮箱/手机号。
  • user_totp_credentials:面向“后台/系统用户(users 表里的账号)”的 2FA(管理后台登录用),隔离边界是系统用户 users.id,权限更高、策略更严(强制 2FA、恢复流程、设备绑定等)。
  • 结论:如果你希望“后台登录也支持/强制 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

Plan: 最小变更 DDL 清单(新增后台 2FA 表)

在你已修复 identifier_id 自增与 project_user_credentials 约束后,下一步最小闭环是:新增一张“后台系统用户 2FA”凭据表,并把 users.auth_id 的引用关系定型(推荐用 user_id 单向关联,避免双向一致性问题);同时顺手把 api_call_logs.project_id 的有符号类型对齐,减少隐式转换与索引失效风险。

Steps

  1. 新增 user_totp_credentials 表:包含 user_idencrypted_secretalgorithm/digits/periodis_active、时间字段与必要索引。
  2. 建立唯一约束:UNIQUE(user_id),保证“一名后台用户一套 2FA”(后续多设备再扩展)。
  3. 建立外键:user_totp_credentials.user_id -> users.id,按策略选 CASCADERESTRICT
  4. 定型 users 的关联方案:推荐不再使用 users.auth_id,改由 user_totp_credentials.user_id 反查(如需兼容,先保留字段但停止写入)。
  5. 对齐字段类型:把 api_call_logs.project_idint 统一为 int unsigned;(可选)把 projects.user_id/created_by 对齐为 int unsigned
  6. 加审计索引(可选但很值):在 audit_logs 增加 (user_id, action_type, created_at)(project_id, action_type, created_at) 以覆盖后台 2FA 事件查询。

Further Considerations

  1. users 关联选型:A 保留并使用 auth_id(需改成 bigint unsigned,且易双向不一致)/ B 推荐仅用 user_totp_credentials.user_id
  2. 删除用户策略:外键 CASCADE(自动删 2FA) vs RESTRICT(必须先解绑 2FA)。
  3. 多设备支持:未来是否要 (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 个结果

Plan: 新增后台 2FA 表最小变更

你已完成两项关键对齐:api_call_logs.project_id 类型统一、并移除了 users.auth_id。接下来最小闭环就是新增“后台系统用户 2FA”凭据表,用 user_id -> users.id 单向关联;由于系统不做删除,仅做禁用,因此外键无需级联删除,凭据/用户都用 status/is_active 控制。多设备暂不做时,不需要也拿不到 Google Authenticator 的 device id。

Steps

  1. 新增 user_totp_credentials:以 user_id 关联 users.id(后台用户 2FA)。
  2. 加唯一约束:UNIQUE(user_id),实现“一名后台用户一套 2FA”。
  3. 加外键:user_totp_credentials.user_id -> users.id,使用 RESTRICT/NO ACTION(不走删除)。
  4. 字段最小集合:encrypted_secretbackup_codes_encryptedalgorithm/digits/periodis_activelast_used_atcreated_at/updated_at
  5. 审计最小增强:不改表结构,补 audit_logs 索引以支持后台 2FA 事件查询。

Further Considerations

  1. 删除策略:既然“不提供删除”,就统一用 users.statususer_totp_credentials.is_active 控制可用性。
  2. device id:Google Authenticator/TOTP 标准不会回传 device id;若未来多设备,只能服务端自建 credential_id/label 来区分。
  3. 审计 action_type:建议新增 ADMIN_2FA_BIND/UNBIND/VERIFY_SUCCESS/VERIFY_FAILADMIN_LOGIN_SUCCESS/FAIL,并为常用查询加索引如 (user_id, action_type, created_at)

目前需求已对齐,接下来就开始执行开发了。

评论区 (0)

你需要先 登录 后才能发表评论。
还没有人评论,赶快成为第一个吧。