代理身份(Agent_ID)
每个代理必须(MUST)拥有唯一且可验证的身份。 格式:基于 URI 的标识符,遵循以下模式:代理身份文档
代理必须(MUST)在其agent_id URI 上发布一个 JSON 文档:
必填字段
| 字段 | 类型 | 描述 |
|---|---|---|
ath_version | string | 协议版本(例如 "0.1") |
agent_id | string | 该代理的规范 URI |
name | string | 人类可读的代理名称 |
developer | object | 开发者信息 |
developer.name | string | 开发者或组织名称 |
developer.id | string | 开发者标识符 |
public_key | string/object | 用于证明验证的 JWK 或 PEM |
可选字段
| 字段 | 类型 | 描述 |
|---|---|---|
developer.contact | string | 安全联系邮箱 |
capabilities | string[] | 代理能力列表 |
服务身份(App_ID)
服务通过其现有标识符进行识别:- 客户端应用:包名(例如
com.example.mail) - 服务端服务:URI(例如
https://api.example.com)
代理证明
代理使用签名的 JWT(代理证明令牌)来证明其身份。JWT 头部
JWT 载荷
必需声明
| 声明 | 描述 |
|---|---|
iss | 签发者 — 代理的域名 |
sub | 主体 — 完整的 agent_id URI |
aud | 受众 — 目标服务或网关 URL |
iat | 签发时间 — 时间戳。实现者必须(MUST)验证 iat 在当前时间 5 分钟以内 |
exp | 过期时间 — 必须(MUST)存在 |
jti | JWT ID — 每个证明必须(MUST)唯一。实现者必须(MUST)维护已见 jti 值的重放缓存(保留至 exp),并拒绝重复值 |
验证
验证方(网关或服务):- 从
agent_idURI 获取代理的身份文档 - 提取公钥
- 使用公钥验证 JWT 签名
- 验证
exp(未过期)和aud(与验证方的 URL 匹配) - 验证
jti此前未被使用过(针对重放缓存检查) - 验证
iat在当前时间 5 分钟以内 - 实现者必须(MUST)拒绝已过期、受众不匹配或
jti重复的证明
身份文档缓存
- 实现者可以(MAY)缓存代理身份文档以减少获取开销
- 缓存的最大生存时间禁止(MUST NOT)超过 5 分钟
- 代理身份文档建议(SHOULD)包含
Cache-Control: max-age=300响应头 - 当证明验证因签名不匹配(而非过期或受众错误)而失败时,实现者建议(SHOULD)重新获取身份文档(绕过缓存),以支持紧急密钥轮换。为防止被利用为 DoS 放大器,实现者必须(MUST)将重新获取频率限制为每个
agent_id每分钟最多一次 - 实现者建议(SHOULD)对获取代理身份文档设置连接和读取超时