Skip to content

feat: Implement static auth registry and capability-based runtime authz#396

Merged
liujuanjuan1984 merged 4 commits intomainfrom
issue-166-single-tenant-authz-eval
Apr 7, 2026
Merged

feat: Implement static auth registry and capability-based runtime authz#396
liujuanjuan1984 merged 4 commits intomainfrom
issue-166-single-tenant-authz-eval

Conversation

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator

@liujuanjuan1984 liujuanjuan1984 commented Apr 7, 2026

Runtime Auth

  • 统一 inbound runtime auth 到 A2A_STATIC_AUTH_CREDENTIALS static credential registry。
  • 新增 src/opencode_a2a/auth.py,集中承载 static credential build、bearer/basic authenticate、capability lookup 与 authenticated principal 结构。
  • Settings 改为仅接受 A2A_STATIC_AUTH_CREDENTIALS 作为 inbound auth 配置来源。
  • 支持多个 bearer / basic credential,并映射到稳定 principal。
  • registry bearer 必须显式声明 principal;basic credential 的 principal 固定等于 username
  • 支持可选 credential_id,进入 runtime principal、request state、call context、executor diagnostics 与 interrupt tracking,便于后续审计、日志、诊断和轮换。

Authz Boundary

  • opencode.sessions.shell 改为要求 session_shell capability。
  • workspace mutation 方法改为要求 workspace_mutation capability。
  • AUTHORIZATION_FORBIDDEN (-32007) 错误契约补齐到 session / workspace 扩展,并在可用时返回 credential_id 便于拒绝路径诊断。
  • 自审中修正了一处语义偏差:高风险接口最终统一为 capability-based authz,不再对外错误宣称“require operator principal”。

Interrupt / State Store

  • credential_id 进入 interrupt runtime binding 与 state-store persistence,但仍不参与 ownership 或 authz 主判定。
  • interrupt callback 在 identity 之外,增加对 credential_id 的可选一致性校验,避免轮换/错配时误回放到错误 credential 视角。
  • state-store schema 升级补充 interrupt credential_id 列,并覆盖 legacy schema migration。

Agent Card / Docs

  • Agent Card 会根据实际配置声明 bearerAuth / basicAuth
  • README、guide、CONTRIBUTING、SECURITY、smoke test 示例统一改为 registry-only inbound auth。
  • guide 补充 stable principal、optional credential_id、credential disable、high-risk capability gating,以及 authz/interruption 诊断语义说明。

Tests / CI

  • 新增独立 auth 单元测试 tests/server/test_auth.py
  • 测试辅助统一改为生成 registry-only auth 配置,不再复用已删除的 legacy runtime auth 语义。
  • 覆盖 session ownership、多 credential、basic auth、Agent Card、workspace/session authz contract、call context、interrupt persistence/mismatch 等回归路径。
  • 跟进修复 quality-gate:为测试假凭证补充 allowlist 标注,并接受 ruff 自动格式化结果。

验证

  • ./scripts/doctor.sh
  • GitHub Actions: quality-gate, runtime-matrix (3.11), runtime-matrix (3.12)

关联

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

自审结果:当前没有发现阻塞合入的问题。

本次重点核对了 3 类内容:

  • 需求贴合度:PR 实际完成的是 #166 收敛方案的实现化,因此由实现 issue #395 承接更准确;当前 PR 使用 Closes #395Relates to #166Relates to #165 是合理的。
  • 语义一致性:runtime auth 已统一收敛到 registry-only;stable principal、multiple bearer/basic、optional credential_id、Agent Card 声明、文档示例和测试辅助语义已对齐。
  • 授权边界:高风险接口最终统一为 capability-based authz,这一点我在自审中额外复核并修正过,避免继续把实现写成 capability gating、对外却宣称“require operator principal”的偏差。

我特别关注了几个风险点,目前判断可接受:

  • credential_id 目前只作为可选 runtime 元数据进入 principal / request state,还没有继续落到专门的审计日志或持久化结构;这符合当前“先把语义带进 runtime,再为后续审计扩展留口”的目标。
  • 这次是明确的 breaking change:旧 inbound auth 环境变量已不再生效。PR 描述和文档已经把迁移入口统一到 A2A_STATIC_AUTH_CREDENTIALS,这一点需要部署方按文档更新。
  • 高风险接口现在按 capability 判定,而不是按 principal 名称硬编码;这让 basic 与 explicit-capability bearer 两种路径都更一致,也更符合当前分支已经演进出来的 registry 模型。

结论:

  • 改动方向合理,和相关 issues 目标一致。
  • 实现比原始 issue 设想更干净,主要体现在去掉 legacy inbound auth、显式 bearer principal、basic -> username principal、以及把 credential_id 降为元数据而非身份主键。
  • 当前未见明显遗漏或冗余到需要阻塞 PR 的程度。

已验证:./scripts/doctor.sh

@liujuanjuan1984 liujuanjuan1984 changed the title Implement registry-based runtime auth and authz boundaries Implement static auth registry and capability-based runtime authz Apr 7, 2026
@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

独立审查结果:未发现新的阻塞性问题。

本轮重点复核了 4 个方面:

  • 需求贴合度:当前 PR 已经不只是 #395 的实现细节,而是把 #166 收敛出的单租户实例内认证/授权模型完整落地,因此 Closes #166Closes #395 是准确的。
  • 实现语义:最终实现已经统一为 registry-only inbound auth、stable principal、capability-based 高风险授权边界,这和本次分支前面的收敛结论一致,没有继续遗留 legacy inbound auth 语义。
  • 契约一致性:runtime、Agent Card、错误契约、文档、测试辅助和独立 auth 单测目前是相互对齐的;此前 capability/principal 的表述偏差也已修正。
  • 工程质量:本轮补上的 quality-gate 修复只涉及测试假凭证 allowlist 与 ruff 格式化,没有引入行为变化;当前 GitHub Actions 已全绿。

我没有发现需要阻塞合入的问题,但仍建议保留两个后续观察点:

  • credential_id 现在只是 runtime 元数据入口,后续如果要真正承接审计/日志能力,还需要明确它进入哪些日志、状态表或诊断输出。
  • 这是明确的 inbound auth breaking change。虽然 README / guide / SECURITY / smoke test 已同步,但部署侧仍需要按 A2A_STATIC_AUTH_CREDENTIALS 完成迁移。

结论:

  • 代码变动整体合理。
  • 实现方式相对干净,主要体现在删除 legacy inbound auth、显式 bearer principal、basic -> username principal、以及把高风险约束收敛为 capability gating。
  • PR 标题、描述与 issue 关系当前已经匹配实际代码范围,无需再收窄。

已复核:

  • ./scripts/doctor.sh
  • GitHub Actions quality-gate
  • GitHub Actions runtime-matrix (3.11)
  • GitHub Actions runtime-matrix (3.12)

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

本轮继续把 credential_id 往下打通到 runtime state 与诊断链路,主要包括:

  • call context / executor diagnostics:credential_idauth_scheme 进入 CallContext.state,executor 日志可携带 identity + credential_id + auth_scheme
  • authz denied error:AUTHORIZATION_FORBIDDEN 在可用时返回 credential_id,方便多 credential 场景下排查被拒绝请求
  • interrupt / state-store:credential_id 进入 interrupt binding 与持久化;interrupt callback 在 identity 之外增加可选的 credential_id 一致性校验
  • migration / tests / docs:state-store schema 升级到 v4,补充 interrupt credential_id 列;相关单测、持久化测试、文档说明已同步更新

验证:

  • ./scripts/doctor.sh
  • 结果:549 passed,coverage 91.08%

本轮提交:8669de1 Propagate credential metadata through runtime state

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

补充一处文档收口:

  • README 与 guide 中面向用户的 inbound bearer 启动示例,已从固定 dev-token 改为运行时生成的 DEMO_BEARER_TOKEN
  • 仍保持 A2A_STATIC_AUTH_CREDENTIALS registry-only 语义,不引入旧配置兼容
  • 这次只调整文档安全示范,不修改测试或 smoke 脚本里的稳定 token,用于避免把“部署示例”和“可重复执行脚本”混在一起

本轮提交:068ae73 Use generated demo bearer tokens in docs

说明:本次为文档示例调整,未运行 ./scripts/doctor.sh;已人工复核相关命令片段与变量引用。

@liujuanjuan1984 liujuanjuan1984 changed the title Implement static auth registry and capability-based runtime authz feat: Implement static auth registry and capability-based runtime authz Apr 7, 2026
@liujuanjuan1984 liujuanjuan1984 merged commit ccf6d80 into main Apr 7, 2026
3 checks passed
@liujuanjuan1984 liujuanjuan1984 deleted the issue-166-single-tenant-authz-eval branch April 7, 2026 07:35
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.

实现静态凭证注册表与实例内最小授权边界 [Priority: Med] [Security] 设计单租户实例内认证与授权模型

1 participant