跨域代理身份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个步骤)
- 领取徽章 --Orchestrator从身份节点的已知端点获取AGNTCY徽章(W3C VC,JWT编码)
- 徽章验证 --编排者根据AGNTCY身份节点对徽章进行加密验证
- ID-JAG交易所 --Orchestrator通过RFC 8693令牌交换将Sarah的IdP ID令牌交换为ID-JAG。AGNTCY徽章以以下方式发送
actor_token. *(这证明了什么,请参阅下面的“实证结果”。)* - 访问令牌薄荷 --资源授权服务器根据IdP JWKS验证ID-JAG,生成绑定到代理和请求作用域的作用域访问令牌
- TBAC执法 --中间件重新验证徽章,检查徽章功能,请求范围对齐,验证目标域授权。工具发货前允许或拒绝。
- 工具执行 --MCP层调度授权的工具调用(天气读数+Slack帖子)。来自访问令牌的主题声明会传播到每次工具调用中进行审计。
双实例部署:
- 服务#1 --AGNTCY身份节点(端口4000)+OpenClaw编排器
- 服务#2 --资源授权服务器(验证ID JAG,创建访问令牌)
两层执法
PoC演示 独立故障域 授权:
| 层 | 权威 | 运营商 | 强制执行 |
|---|---|---|---|
| 能力 | AGNTCY身份节点 | 徽章JWT(能力) | TBAC中间件 |
| 作用域 | IdP(xaa.dev或Okta) | 访问令牌(OAuth作用域) | 资源认证服务器+中间件 |
一层的妥协不会使另一层坍塌。徽章上写着“这个特工 *可能* 执行这些操作”;访问令牌显示“此令牌 *携带许可* 在这个资源上做这些事情。“两者都是必需的。
路径A:xaa.dev IdP
设置
- 注册应用程序 在https://xaa.dev.您将收到四个凭证:
- 主(IdP)客户端ID+密码 - 资源客户端ID+密钥(形状: {client_id}-at-res_{uuid})
- 配置资源应用程序 在xaa.dev:
- 资源标识符URL:您的资源认证服务器的受众标识符 - MCP范围: weather.read, slack.post.agent-weather-alerts - MCP资源URI和所需工具
- 导出环境变量 (服务#1):
export USE_XAA_DEV=true
export XAA_CLIENT_ID=
export XAA_CLIENT_SECRET=
export XAA_RESOURCE_CLIENT_ID=
export XAA_RESOURCE_CLIENT_SECRET=
export XAA_RESOURCE_AUDIENCE=http://weather-slack-resources.com
export SLACK_CHANNEL=agent-weather-alerts
export SLACK_BOT_TOKEN=- Bootstrap Sarah的ID令牌:
export XAA_ID_TOKEN=$(python -m scripts.get_xaa_id_token)- 运行演示:
python -m agent.xaa_orchestrator --demo路径B:Okta租户IdP
先决条件
- Okta租户 跨应用访问(EA) 启用
- 代理0 已安装(跨应用程序访问示例请求应用程序)目录应用程序→ 代表openclaw代理
- 全部0 已安装(跨应用程序访问示例资源应用程序)目录应用程序→ 表示资源(天气松弛资源)
- 测试分配给两个应用程序的用户
- 管理在两个应用程序上双向建立的连接(“应用程序授予同意”+“提供同意的应用程序”)
设置
- 配置Okta应用程序:
- Agent0重定向URI: http://localhost:8080/callback - Todo 0重定向类型: http://localhost:5001/openid/callback/customer1
- 配置资源身份验证服务器 (服务#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
- 导出环境变量 (服务#1):
export USE_XAA_DEV=false
export OKTA_DOMAIN=.oktapreview.com
export ORG2_DOMAIN=.oktapreview.com
export OKTA_CLIENT_ID=
export OKTA_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=@example.com
export SLACK_CHANNEL=agent-weather-alerts
export SLACK_BOT_TOKEN=- 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="
"- 运行演示:
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——请参阅 许可证.
