Skip to content

docs(auth): design coding agent subscription accounts - #566

Draft
winterfx wants to merge 7 commits into
mainfrom
codex/issue-562-subscription-auth-design
Draft

docs(auth): design coding agent subscription accounts#566
winterfx wants to merge 7 commits into
mainfrom
codex/issue-562-subscription-auth-design

Conversation

@winterfx

@winterfx winterfx commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • design named Accounts for OpenAI Codex and Anthropic subscription authentication, alongside existing API key providers
  • define the interactive login/logout flow, per-agent YAML selection, daemon-owned credential forwarding, and scheduler boundaries
  • document the proposed SQLite migration, backward compatibility, token refresh, and security requirements

Related to #562.

Testing

  • task docs:build

Checklist

  • Documentation updated when behavior or configuration changed.
  • Tests added or updated for user-visible behavior. Not applicable: this PR only adds a design document.
  • No secrets, private endpoints, internal certificates, or local runtime state included.

@monkeyscan

monkeyscan Bot commented Aug 5, 2026

Copy link
Copy Markdown

评审任务执行失败:任务执行超时。

@monkeyscan

monkeyscan Bot commented Aug 5, 2026

Copy link
Copy Markdown

MonkeyScan 正在评审本次 push 新增到 PR 的变更,完成后会更新到本评论中,请稍后刷新查看。

@monkeyscan

monkeyscan Bot commented Aug 5, 2026

Copy link
Copy Markdown

评审任务执行失败:任务执行超时。

@monkeyscan

monkeyscan Bot commented Aug 5, 2026

Copy link
Copy Markdown

评审任务执行失败。

@monkeyscan

monkeyscan Bot commented Aug 6, 2026

Copy link
Copy Markdown

PR Title: docs(auth): design coding agent subscription accou...

Commit: 27ce53d

本次变更仅修改设计文档 docs/design/coding_agent_subscription_auth_design.md(+45/-20),核心调整:(1) 删除 Anthropic 授权前 extra usage 计费确认提示;(2) 新增 3.1 节说明仅订阅账号部署可用但 scheduler.llm / LLMService.Generate 不可用;(3) 将 credential 存储从 AEAD 加密(encryption_key_id/secret_nonce/secret_ciphertext)改为 SQLite 明文 secret_json,并相应删除"OAuth token 不出现在数据库明文"验收标准;(4) 新增 5.4 节 Protobuf/ConnectRPC AccountService 设计;(5) 在安全约束中补充 data root/SQLite 文件/备份仅 daemon 用户可访问;(6) 简化实施步骤与测试清单。文档内部一致(全文已无残留"加密"描述)。核心风险:以文件权限替代静态加密来保护 OAuth refresh token 与 API Key,属于明显的安全降级,是本评审唯一高置信发现;Anthropic 计费确认的移除因无可注释 diff 锚点且属有意决策,未单列发现。

@monkeyscan

monkeyscan Bot commented Aug 6, 2026

Copy link
Copy Markdown

PR Title: docs(auth): design coding agent subscription accou...

Commit: a4bdf6a

本次变更仅修改设计文档 docs/design/coding_agent_subscription_auth_design.md 中的一处 CLI 交互示例文案:将“Subscription account (browser login)”改为“Subscription account (OAuth)”(+1/-1)。

文档通篇描述订阅账号认证使用厂商专用 OAuth(Codex 支持 Authorization Code + PKCE 与 Device Code,Anthropic 使用 Authorization Code + PKCE),因此“OAuth”比“browser login”更准确地概括了这两种登录方式,且与文中“订阅账号使用厂商专用 OAuth”的表述保持一致。该改动仅为文档措辞修正,不涉及任何代码、行为或安全影响,未发现可操作的问题。

- `managed_api_key`:CLI/UI 提交,由 daemon 保存;
- `oauth`:daemon 保存并刷新 access/refresh token。

managed credential 以明文 `secret_json` 保存在 SQLite,不引入额外 encryption key。所有面向用户的 API、日志和诊断输出必须省略或脱敏 credential。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

设计将 OAuth token 与 API Key 改为 SQLite 明文存储,移除静态加密保护

本变更删除了 llm_credential 中的 encryption_key_id / secret_nonce / secret_ciphertext 列和 AEAD 加密方案(第 232 行改为明文 secret_json TEXT),并把第 8 节完成标准从“OAuth token 不出现在数据库明文”弱化为只约束日志/API/YAML/Sandbox。涉及的是长期有效的高价值凭证:OAuth refresh token(可持续访问用户付费订阅账号)和 managed API Key(可产生费用)。新增的唯一缓解措施是文件系统权限(data root、SQLite 文件与备份只能由 daemon 运行用户访问),但该控制较脆弱:备份常被复制到权限更宽松的介质、同用户下其他进程/agent 可读取 data root、崩溃转储或容器镜像层可能暴露数据库文件。一旦数据库文件或备份泄露,所有已存凭证可被直接使用,无需再破解。

Problem code:

Changed code at docs/design/coding_agent_subscription_auth_design.md:273

Recommendation:
建议保留静态加密:例如用 data root 受限文件或系统 keychain 中的密钥对 secret_json 做 AEAD,密钥与密文分离存储;若确要放弃加密,应在设计文档中正式记录风险接受决策,并强制要求整盘加密、备份访问控制与数据库文件最小权限,同时恢复“OAuth token 不出现在数据库明文”的验收标准,避免完成标准与安全要求被悄悄放宽。

Suggested diff:

### 5.3 Credential 存储

- `managed_api_key`:CLI/UI 提交,由 daemon 保存;
- `oauth`:daemon 保存并刷新 access/refresh token。

managed credential 与 OAuth refresh token 使用 AEAD 加密后写入 secret_json;加密密钥由 operator 注入或首次使用时生成在 data root 的受限文件中,不能与密文一起存进 SQLite。密钥不可用时 Account 进入 reauth_required,不得降级为明文存储。所有面向用户的 API、日志和诊断输出必须省略或脱敏 credential。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants