上游认证
每个已注册的 A2A Agent 都会保存 AISIX 用来认证到该上游 Agent 的凭证。AISIX 在网关侧持有该凭证,并在转发调用时向上游出示。A2A 客户端发送给 AISIX 的调用方 API Key 只用于认证调用方到 AISIX,不会被转发或暴露给上游 Agent。
在注册或更新 Agent 时,通过 auth_type 字段及其配套字段设置上游凭证。AISIX 会把同一凭证用于它对上游执行的两类操作:获取 Agent card,以及转发 JSON-RPC 调用。
auth_type | 上游凭证 | AISIX 如何发送 |
|---|---|---|
none | 无 | 不发送凭证。 |
bearer | secret(Bearer Token) | Authorization: Bearer <secret> |
api_key | secret(API Key) | x-api-key: <secret> |
oauth2 | client_id + token_url + secret | 资源中可接受,但运行时尚不可用;见下文。 |
secret 保存 AISIX 需要向上游出示的明文凭证。该凭证只在网关侧使用,不会发送给调用方客户端。要轮换凭证,请使用新的 secret 更新资源。
无认证
当上游 Agent 不需要凭证时使用 none,例如该 Agent 只在可信内部网络中可访问。
curl -sS -X POST "http://127.0.0.1:3001/admin/v1/a2a_agents" \
-H "Authorization: Bearer ${AISIX_ADMIN_KEY}" \
-H "Content-Type: application/json" \
-d '{
"display_name": "invoice-processor",
"url": "https://agents.internal/invoice",
"protocol_version": "0.3",
"auth_type": "none"
}'
auth_type 默认为 none,因此也可以省略。none Agent 不应设置 secret、client_id、token_url 和 scopes。
Bearer Token
当上游 Agent 期望在 Authorization 请求头中收到静态 Token 时,使用 bearer,并把 Token 写入 secret。
curl -sS -X POST "http://127.0.0.1:3001/admin/v1/a2a_agents" \
-H "Authorization: Bearer ${AISIX_ADMIN_KEY}" \
-H "Content-Type: application/json" \
-d '{
"display_name": "research-assistant",
"url": "https://agents.example.com/a2a",
"protocol_version": "0.3",
"auth_type": "bearer",
"secret": "YOUR_UPSTREAM_TOKEN"
}'
AISIX 会在每个发往该上游的请求中发送 Authorization: Bearer YOUR_UPSTREAM_TOKEN。secret 必填且不能为空。
API Key
当上游 Agent 期望在 x-api-key 请求头中收到 Key 时,使用 api_key,并把 Key 写入 secret。
curl -sS -X POST "http://127.0.0.1:3001/admin/v1/a2a_agents" \
-H "Authorization: Bearer ${AISIX_ADMIN_KEY}" \
-H "Content-Type: application/json" \
-d '{
"display_name": "translator",
"url": "https://agents.example.com/translate",
"protocol_version": "0.3",
"auth_type": "api_key",
"secret": "YOUR_UPSTREAM_API_KEY"
}'
AISIX 会在每个发往该上游的请求中发送 x-api-key: YOUR_UPSTREAM_API_KEY。secret 必填且不能为空。
OAuth 2.0 Client Credentials 尚不可用
Agent 资源中可以接受 oauth2 认证类型,以便向前兼容,但数据面运行时尚不会获取 Token。你可以创建 oauth2 Agent,并提供 client_id、token_url 和写入 secret 的 OAuth client secret;但调用该 Agent 会返回 HTTP 501,其 Agent card 也不会被提供。
# 写入时可以接受,但在运行时支持 OAuth 2.0 client credentials grant 之前,
# 调用该 Agent 会返回 501。
curl -sS -X POST "http://127.0.0.1:3001/admin/v1/a2a_agents" \
-H "Authorization: Bearer ${AISIX_ADMIN_KEY}" \
-H "Content-Type: application/json" \
-d '{
"display_name": "orders",
"url": "https://agents.example.com/orders",
"auth_type": "oauth2",
"client_id": "aisix-gateway",
"token_url": "https://auth.example.com/oauth/token",
"secret": "YOUR_OAUTH_CLIENT_SECRET",
"scopes": ["a2a.invoke"]
}'
在运行时支持该能力前,请为需要认证的 Agent 使用 bearer 或 api_key。
校验规则
AISIX 会在创建或更新 Agent 时根据 auth_type 校验凭证字段:
none:不要设置secret、client_id、token_url和scopes。bearer/api_key:secret必填且不能为空。oauth2:client_id、token_url和secret都必填且不能为空;scopes可选。资源可以写入,但调用会返回501,见上文。
不满足规则的 Agent 会在写入时以 HTTP 400 拒绝。包含 / 的 display_name 也会被拒绝,因为它会作为 Agent URL 的路径片段。重复的 display_name 会以 409 拒绝。
如果凭证后续失效(例如被轮换或吊销),该 Agent 的调用会失败,但其它已注册 Agent 不受影响。该失败会被记录为 bad-gateway(502)上游错误,凭证细节不会暴露给调用方客户端。
凭证隔离
上游凭证不会跨到调用方客户端:
- 客户端只出示自己的 AISIX 调用方 API Key。AISIX 用它认证调用方,并使用该 Agent 自己配置的凭证向上游转发请求。
- 当上游失败时,AISIX 返回 HTTP
502;上游状态只会出现在 JSON-RPC 错误信息中,上游响应体不会被透传回来。 - AISIX 提供的 Agent card 会保留上游 Agent 声明的元数据,但会把服务
url重写为网关地址;其中不包含上游凭证。
下一步
- 按 Key 控制 Agent 访问:决定哪些调用方可以访问哪些 Agent。
- Agent 网关概览:注册 Agent 并完成端到端访问。
- 限流与预算:在调用方 API Key 上限制和治理 A2A 调用。