跨域代理身份验证

一个跨域AI代理身份的概念验证,结合AGNTCY身份证明(W3C可验证凭证)与跨应用访问(RFC 8693令牌交换/IETF ID-JAG),用于验证代理身份和权限。

  • by AKRita23
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 AKRita23/xdomain-openclaw-agntcy-poc

使用说明

跨域代理身份PoC

跨域AI代理身份的工作概念证明,结合 AGNTCY身份证明 (W3C可验证证书) 跨应用访问 (RFC 8693令牌交换/ITF-ID-JAG)。


这表明了什么

OpenClaw代理代表授权用户(Sarah)执行跨域任务(读取天气、发布到特定的Slack频道),具有两层信任:

能力层 --AGNTCY颁发的W3C可验证凭证(徽章)证明了代理的身份和能力,经过签名和加密验证。

范围层 --IETF身份断言JWT授权授予(ID-JAG,Okta XAA)通过企业IdP发布范围访问令牌,在自托管资源授权服务器上进行验证。

两层独立执行。通道限制范围(slack.post.agent-weather-alerts,不 slack.post).主题端到端传播以供审核。相同的编排器代码针对两个不同的IdP运行。


建筑

端到端流程(6个步骤)

  1. 领取徽章 --Orchestrator从身份节点的已知端点获取AGNTCY徽章(W3C VC,JWT编码)
  2. 徽章验证 --编排者根据AGNTCY身份节点对徽章进行加密验证
  3. ID-JAG交易所 --Orchestrator通过RFC 8693令牌交换将Sarah的IdP ID令牌交换为ID-JAG。AGNTCY徽章以以下方式发送 actor_token. (这证明了什么,请参阅下面的“实证结果”。)
  4. 访问令牌薄荷 --资源授权服务器根据IdP JWKS验证ID-JAG,生成绑定到代理和请求作用域的作用域访问令牌
  5. TBAC执法 --中间件重新验证徽章,检查徽章功能,请求范围对齐,验证目标域授权。工具发货前允许或拒绝。
  6. 工具执行 --MCP层调度授权的工具调用(天气读数+Slack帖子)。来自访问令牌的主题声明会传播到每次工具调用中进行审计。

双实例部署:

  • 服务#1 --AGNTCY身份节点(端口4000)+OpenClaw编排器
  • 服务#2 --资源授权服务器(验证ID JAG,创建访问令牌)

两层执法

PoC演示 独立故障域 授权:

层 权威 运营商 强制执行
能力 AGNTCY身份节点 徽章JWT(能力) TBAC中间件
作用域 IdP(xaa.dev或Okta) 访问令牌(OAuth作用域) 资源认证服务器+中间件

一层的妥协不会使另一层坍塌。徽章上写着“这个特工 可能 执行这些操作”;访问令牌显示“此令牌 携带许可 在这个资源上做这些事情。“两者都是必需的。

路径A:xaa.dev IdP

设置

  1. 注册应用程序 在https://xaa.dev.您将收到四个凭证:

    • 主(IdP)客户端ID+密码
    • 资源客户端ID+密钥(形状: {client_id}-at-res_{uuid})
  2. 配置资源应用程序 在xaa.dev:

    • 资源标识符URL:您的资源认证服务器的受众标识符
    • MCP范围: weather.read, slack.post.agent-weather-alerts
    • MCP资源URI和所需工具
  3. 导出环境变量 (服务#1):

   export USE_XAA_DEV=true
   export XAA_CLIENT_ID=<main-client-id>
   export XAA_CLIENT_SECRET=<main-client-secret>
   export XAA_RESOURCE_CLIENT_ID=<resource-client-id>
   export XAA_RESOURCE_CLIENT_SECRET=<resource-client-secret>
   export XAA_RESOURCE_AUDIENCE=http://weather-slack-resources.com
   export SLACK_CHANNEL=agent-weather-alerts
   export SLACK_BOT_TOKEN=<xoxb-...>
  1. Bootstrap Sarah的ID令牌:
   export XAA_ID_TOKEN=$(python -m scripts.get_xaa_id_token)
  1. 运行演示:
   python -m agent.xaa_orchestrator --demo

路径B:Okta租户IdP

先决条件

  • Okta租户 跨应用访问(EA) 启用
  • 代理0 已安装(跨应用程序访问示例请求应用程序)目录应用程序→ 代表openclaw代理
  • 全部0 已安装(跨应用程序访问示例资源应用程序)目录应用程序→ 表示资源(天气松弛资源)
  • 测试分配给两个应用程序的用户
  • 管理在两个应用程序上双向建立的连接(“应用程序授予同意”+“提供同意的应用程序”)

设置

  1. 配置Okta应用程序:

    • Agent0重定向URI: http://localhost:8080/callback
    • Todo 0重定向类型: http://localhost:5001/openid/callback/customer1
  2. 配置资源身份验证服务器 (服务#2-- resource-auth-server/.env): OKTA_ISSUER=https://.oktapreview.com 资源_审计=http://localhost:5001 注册_客户端ID=wiki0-at-todo0 本地_签名_密钥= ACCESS_TOKEN_TTL=3600 重新启动: sudo systemctl restart resource-auth-server.service

  3. 导出环境变量 (服务#1):

   export USE_XAA_DEV=false
   export OKTA_DOMAIN=<your-tenant>.oktapreview.com
   export ORG2_DOMAIN=<your-tenant>.oktapreview.com
   export OKTA_CLIENT_ID=<Agent0 client id>
   export OKTA_CLIENT_SECRET=<Agent0 client secret>
   export WEATHER_AUDIENCE=http://localhost:5001
   export SLACK_AUDIENCE=http://localhost:5001
   export RESOURCE_AUTH_CLIENT_ID=wiki0-at-todo0
   export DELEGATING_USER=<your-test-user>@example.com
   export SLACK_CHANNEL=agent-weather-alerts
   export SLACK_BOT_TOKEN=<xoxb-...>
  1. Bootstrap Sarah的ID令牌 (针对Okta org认证服务器的授权码+PKCE):
   sudo lsof -ti:8080 | xargs -r sudo kill -9 2>/dev/null
   python -m scripts.get_okta_sarah_token
   export SARAH_ACCESS_TOKEN="<paste eyJ... JWT>"
  1. 运行演示:
   python -m agent.xaa_orchestrator --demo

路径B注意事项

PoC目前使用Okta的目录Todo0占位符默认值,而不是 自定义注册受众和客户端id值。这是因为 租户端受众覆盖(由Okta的XAA团队管理)正在等待处理。作为一个 结果:

  • 观众声明 在ID-JAG中 http://localhost:5001 (Todo0目录 默认值),而不是资源身份验证服务器的实际公共URL。资源身份验证 服务器已配置为接受此受众以完成流程。
  • 客户身份 在ID-JAG中 wiki0-at-todo0 (Okta的目录出炉了 Agent0的资源侧客户端标识符→Todo0样本对),而不是openclaw代理的名称。

这 加密信任链完好无损 (Okta符号,资源认证服务器 根据Okta的JWKS进行验证,强制进行受众匹配)。占位符 标签是使用目录占位符应用程序的一个有记录的限制 通过Okta XAA团队配置在生产中替换为实际值 部署。

项目结构

路径 目的
agent/xaa_orchestrator.py 6步XAA流编排器
agent/config.py AgentConfig env变量加载器
identity/badge_issuer.py 从知名端点获取AGNTCY徽章
identity/badge_verifier.py AGNTCY徽章加密验证
identity/xaa_dev_client.py 路径A --xaa.dev IdP代币交换
identity/okta_xaa.py 路径B --Okta IdP代币交易所
identity/resource_exchange.py ID-JAG→ 资源认证服务器上的访问令牌兑换
middleware/agntcy_tbac.py TBAC执行(badge.cabilityзtoken.scopesз任务)
mcp_servers/weather_mcp.py 打开Meteo工具调度器
mcp_servers/slack_mcp.py 松弛 chat.postMessage 工具调度员
resource-auth-server/main.py 独立资源身份验证服务器(LIST#2)
scripts/get_xaa_id_token.py Sarah的ID令牌引导——路径A
scripts/get_okta_sarah_token.py Sarah的ID令牌引导——路径B
tests/ 单元+集成测试
docs/xaa-flow.png 架构图
requirements.txt Python依赖关系
.env.example Env-var模板

资源API强制执行(开放工作)

Open Meteo和Slack是 未启用XAA 在这个PoC中——访问令牌 在编排器/MCP中间件层而不是在 资源API本身。这被记录为范围界定决定:贡献 该PoC的一部分是直到访问令牌的代理信任边界(徽章+范围)。关闭最后一跳需要:

  • 支持模拟XAA的资源服务(例如Auth0的XAA资源测试版),或
  • 目标API中的本机XAA支持

许可证

Apache 2.0——请参阅 许可证.