上游身份认证
每个已注册的 Agent-to-Agent(A2A)Agent 都定义了 AISIX 是否以及如何向其上游进行身份认证。在获取 Agent Card 或转发 JSON-RPC 调用时,AISIX 会提供已配置的凭证(如有)。客户端使用调用方 API Key 向 AISIX 进行身份认证,默认情况下没有任何调用方请求头会到达该 Agent。需要看到某个请求头的 Agent(包括调用方自己的凭证),通过 forward_client_headers 显式开启。
这种分离方式让每个上游可以采用所需的身份认证方案,而调用方只需保留一个 AISIX 凭证。AISIX Cloud 和开源 AISIX 网关通过不同管理方式支持相同的模式。
前置条件
请完成 AISIX Cloud 或开源 AISIX 网关的配置 Agent 网关。如需执行 可选的端到端验证,请保持同一个 Shell、网关、测试 Agent 和临时 Docker 网络运行。
身份认证模式
请选择与上游 Agent 要求相符的模式:
auth_type | 必填字段 | 上游请求头 |
|---|---|---|
none | 无 | 不发送凭证。 |
bearer | secret | Authorization: Bearer <secret> |
api_key | secret | x-api-key: <secret> |
auth_type 默认为 none。在此模式下,不要设置 secret。bearer 和 api_key 模式要求提供非空 secret。
使用凭证的上游应采用 HTTPS。如果为 http:// URL 配置了 Bearer Token 或 API Key,网关会记录警告,因为凭证将以明文通过网络传输。
要求 HTTP Basic 认证的 Agent 没有对应的 auth_type。请把凭证写在 Agent 的 url 中,例如 https://user:password@agents.example.com/a2a,并将 auth_type 保持为 none。网关会以 Authorization: Basic 请求头发送这些凭证。日志和错误消息按原样显示该 URL,凭证也不例外。与 secret 不同,该 URL 不是只写字段:AISIX Cloud 会在 Agent 响应中按原样返回它。
配置上游身份认证
以下示例为配置指南中已注册的 echo-agent 添加 Bearer 身份认证。将该条目改为指向需要凭证的上游时,还应替换它的 URL。如果上游要求 x-api-key,请改用 api_key。echo Agent 本身不验证凭证。如需在本地测试凭证转发,请跳过这些示例,继续阅读可选:使用本地测试代理验证;该部分会提供专用 Token 和最终资源更新。
AISIX Cloud
导出凭证,然后更新已注册 Agent:
export A2A_AGENT_TOKEN="YOUR_UPSTREAM_TOKEN"
curl -fsS -X PATCH "$AISIX_CP/a2a_agents/$A2A_AGENT_ID" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
--data-binary @- <<EOF | jq
{
"auth_type": "bearer",
"secret": "${A2A_AGENT_TOKEN}"
}
EOF
该凭证为只写字段:AISIX Cloud 会对其进行静态加密,并且不会在创建、列表或更新响应中返回。发送新的 secret 会轮换凭证。从使用凭证的模式改为 none 会清除已存储的凭证。
开源 AISIX 网关
将 a2a_agents 中现有的 echo-agent 条目替换为以下更新后的条目。该条目引用网关环境变量。保留无关的 Agent 和集合:
a2a_agents:
- name: echo-agent
url: http://aisix-a2a-echo:8080
protocol_version: "1.0"
auth_type: bearer
secret: ${A2A_AGENT_TOKEN}
加载文件前,请在网关进程环境中设置 A2A_AGENT_TOKEN。如果被引用的变量未设置或为空,验证将失败。如果该变量已存在于运行中的容器内,请验证完整文件并发送 SIGHUP:
docker exec aisix-quickstart \
aisix validate --resources /etc/aisix/resources.yaml
docker kill --signal HUP aisix-quickstart
新增或修改容器环境变量时,需要使用新值重新创建该容器。有关验证和重新创建流程,请参阅重新加载资源文件。
凭证失败
上游凭证绝不会传递给调用客户端。AISIX 提供的 Agent Card 包含上游 Agent 的元数据,并会将服务 URL 重写为网关路径,但不会包含已配置的凭证。
如果上游拒绝已过期、已轮换或已撤销的凭证,只有对该 Agent 的调用会失败。AISIX 返回 HTTP 502;上游状态会出现在 JSON-RPC 错误消息中,但上游响应正文不会代理给调用方。
向上游 Agent 转发调用方请求头
上面那份凭证属于网关。而按最终用户授权的内网 Agent 需要的是调用方自己的请求头,forward_client_headers 就是它获得该请求头的途径。它是一个请求头名称模式数组,默认为空,两种管理路径都支持。它对 /a2a/<name>/.well-known/agent-card.json 上的 Agent Card 拉取,以及 /a2a/<name> 上的每个 JSON-RPC 方法都生效,因此 message/send、message/stream 和各类 task 操作都会收到这些请求头。
通过 AISIX Cloud Admin API,可以在创建 Agent 时设置,也可以之后 PATCH。PATCH 是整体替换已存储的列表;传空数组即清 空:
curl -fsS -X PATCH "$AISIX_CP/a2a_agents/$A2A_AGENT_ID" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"forward_client_headers": ["authorization", "x-trace-*"]
}'
在控制台中,同一设置是 Agent 表单里 Advanced 下的 Forward client headers 输入框,每行填一个请求头名称或通配符。
在开源 AISIX 网关加载的资源文件中:
a2a_agents:
- name: invoice-processor
url: https://agents.internal.example.com/a2a
auth_type: none
forward_client_headers:
- authorization
- x-trace-*
每个条目可以是精确的请求头名称,也可以是包含一个 * 通配符的名称,匹配不区分大小写。被转发的请求头会到达该 Agent,无论 AISIX 本来打算怎么处理它。
点名一个凭证槽位,会把调用方的凭证取代网关的凭证交给该 Agent,绝不会两个都发。bearer 填的槽位是 authorization,api_key 填的槽位是 x-api-key