我们要构建什么
你有一个带 API 的后端。你希望 AI Agent 能调用该 API——但只有在服务批准且用户同意之后。完成本教程后,你的应用将支持完整的 ATH 协议。开始之前
你需要什么
| 需求 | 为什么需要 | 没有的话? |
|---|---|---|
| 一个有 API 的后端 | Agent 要访问的目标 | 本教程使用 Express,但任何 HTTP 框架都可以 |
| 一个 OAuth 服务器 | Agent 需要用户授权,这通过 OAuth 完成。用户在浏览器中看到授权界面并点击”批准” | 使用你现有的(Auth0、Clerk 等)或演示内置的 OAuth 服务器 |
| 一个用户浏览器可达的回调 URL | 用户点击”批准”后,浏览器会重定向到这个 URL。它不需要是公网地址——只需要用户打开浏览器的地方能访问到即可 | 开发环境中,如果服务器在 localhost,http://localhost:3000/ath/callback 就没问题,只要用户的浏览器在同一台机器上 |
为什么 ATH 需要 OAuth?
为什么 ATH 需要 OAuth?
ATH 不是替代 OAuth——而是在其之上添加一层。各部分的作用:
- ATH 处理:“服务是否信任这个 Agent?“(注册)和”权限的交集是什么?“(作用域交集)
- OAuth 处理:“用户是否同意?“(浏览器中的授权界面)
/ath/authorize 端点时,你的服务器会构建一个 OAuth 授权 URL 并返回。Agent 告诉用户”请打开这个 URL”。用户的浏览器跳转到你的 OAuth 服务器,用户看到授权界面,批准后,浏览器重定向到 /ath/callback。这就是为什么你需要一个用户浏览器可达的回调 URL。如果我没有公网 URL 怎么办?
如果我没有公网 URL 怎么办?
本地开发时,localhost 回调 URL 完全没问题——用户的浏览器和你的服务器在同一台机器上。生产环境中,如果你的应用在防火墙后面,有两个选择:
- 通过反向代理或隧道暴露
/ath/callback路由 - 改用**网关模式**——网关有公网 URL,替你处理回调
你不需要什么
- ❌ 深入的安全知识——SDK 处理 JWT 签名、PKCE 和令牌管理
- ❌ 一个用于测试的 Agent——我们将使用
athxCLI 工具来模拟 - ❌ 开发期间的公网 URL——localhost 即可
步骤 1:安装 SDK
@ath-protocol/server 提供了所有 ATH 端点的现成处理程序。你是把它们接入到你的路由——而非从头实现协议。
步骤 2:添加发现端点
这是一个简单的 JSON 文件,告诉 Agent:“这是我的身份、我提供的权限,以及如何连接。”什么是作用域,如何选择?
什么是作用域,如何选择?
作用域定义 Agent 可以请求的具体权限。将它们映射到你的 API 实际功能:
使用
| 你的 API 路由 | 方法 | 建议的作用域 |
|---|---|---|
/api/products | GET | products:read |
/api/cart/add | POST | cart:write |
/api/orders | POST | orders:write |
/api/orders | GET | orders:read |
resource:action 格式(如 products:read、cart:write)。用户会在授权界面看到这些,所以要让它们易于理解。步骤 3:创建 ATH 路由文件
创建routes/ath.ts。这个文件将 SDK 的处理程序接入你的 Express 路由:
每个配置字段的作用是什么?
每个配置字段的作用是什么?
步骤 4:挂载路由
步骤 5:连接你的 OAuth 服务器
ATH 需要 OAuth 服务器来向用户展示授权界面。你的选择:| 情况 | 怎么做 |
|---|---|
| 我使用 Auth0、Clerk、Firebase Auth 等 | 将 oauth.authorize_endpoint 和 oauth.token_endpoint 指向你的提供商。参见现有 OAuth 指南。 |
| 我有自定义 OAuth 服务器 | 同上——将配置指向你的端点 |
| 我还没有 OAuth | 以演示的内置 OAuth 服务器为起点,或改用网关 |
将 ATH 注册为 OAuth 客户端
ATH 配置中的oauth.client_id 和 oauth.client_secret 是 ATH 作为 OAuth 客户端与你的 OAuth 服务器交互的凭据。你需要在 OAuth 提供商处注册:
- 在你的 OAuth 服务器(Auth0、Clerk 或自建)中,创建一个新的”应用”或”客户端”
- 将允许的重定向 URI 设置为
${YOUR_BASE_URL}/ath/callback(如http://localhost:3000/ath/callback) - 将客户端 ID 和客户端密钥复制到你的 ATH 配置中
为什么 ATH 需要成为 OAuth 客户端?
为什么 ATH 需要成为 OAuth 客户端?
当 Agent 调用
/ath/authorize 时,ATH 需要将用户重定向到你的 OAuth 服务器的授权界面。为此,它充当 OAuth 客户端——向授权 URL 发送带有 client_id、redirect_uri 和 scope 的请求。用户批准后,你的 OAuth 服务器将用户浏览器重定向到 /ath/callback 并附带授权码。ATH 随后在服务器端使用 client_secret 将该授权码交换为 OAuth 令牌。该令牌存储在内部——Agent 永远看不到它。因此 ATH 配置中的 client_id/client_secret 是用于你的 OAuth 服务器的,而非用于 Agent。Agent 在 ATH 注册期间会获得自己独立的 client_id/client_secret。代理转发层如何连接到你的 API
代理转发端点(/ath/proxy/your-app/*)位于你现有 API 的前面。当 Agent 发起请求时:
代理转发层在转发到你的 API 之前将 ATH 令牌替换为存储的 OAuth 令牌。你现有的 API 认证中间件看到的是一个有效的 OAuth 令牌,正常工作——它不知道有 Agent 参与。
这意味着:
- 你的 API 路由完全不需要改动
- 你现有的认证中间件继续正常工作
- Agent 永远看不到用户的 OAuth 令牌
步骤 6:测试
启动你的应用,然后使用athx CLI 模拟 Agent:
$YOUR_APP_URL 替换为你的服务器实际 URL(如 http://localhost:3000)。
如果 athx register 报 INVALID_ATTESTATION 错误怎么办?
如果 athx register 报 INVALID_ATTESTATION 错误怎么办?
在开发环境中设置了
skipAttestationVerification: true 时,这不应该发生。如果发生了:- 确保你的服务器正在运行且可在指定 URL 访问
- 检查
--service中的 URL 是否与 ATH 配置中的audience一致 - 查看服务器日志获取错误详情
你刚刚构建了什么
你现有的 API 路由没有改变。你在它们前面添加了一个信任层,确保:- Agent 已注册并获得批准(阶段 A)
- 用户在浏览器中已授权(阶段 B)
- Agent 只获得批准作用域的交集
下一步
- 将 ATH 添加到现有 Express 应用 ——查看准确的前后对比
- 连接到你现有的 OAuth ——Auth0、Clerk 或自定义 OAuth 配置
- 运行完整演示 ——在真实电商应用中看到端到端运行