认证详解
说明: 本页出现的
abx命令由cli仓库中的 Node.js CLI 提供(npm install -g @agent-sandbox/cli)。CLI 专属文档(CLI 设计、教程、参考)也在该仓库;本仓库记录 Python SDK(agent-sandbox)与容器侧运行时(agent-sandbox-server)。
Agent Sandbox 支持两种认证模式:API Key 和 AK/SK(阿里云 AccessKey)。
凭证属于某个提供方。内置提供方是阿里云极速版(Alibaba Cloud Express Edition),id 为 alicloud-express,也是默认提供方。沙箱密钥是 ABX_SANDBOX_API_KEY。阿里云 AccessKey 使用官方名字 ALICLOUD_ACCESS_KEY_ID 和 ALICLOUD_ACCESS_KEY_SECRET。地域是 ALIBABA_CLOUD_REGION_ID。每个键只有一个名字。
历史说明:
abx authCLI 命令组(login/logout/status/switch)已在首个正式版0.1.0之前移除。凭证通过下方介绍的环境变量与abx config set sandbox_api_key配置;用abx config list查看生效状态。
认证方式总览
Agent Sandbox 存在三条认证路径,适用于不同场景:
- API Key 模式:最常用。通过
Authorization: Bearer {api_key}请求头访问平台 API。适用于个人开发、CI/CD、SDK 调用等绝大多数场景。 - AK/SK 模式(阿里云 AccessKey)🧪 实验性:使用阿里云 AccessKey 对,通过 token 交换获取临时 API Key。框架已实现,但 token 交换端点待 FC 平台确认,当前推荐仍使用 API Key 模式。适用于阿里云生态集成、企业内部使用 RAM 角色授权的场景。
- envd 内部认证:沙箱创建后,SDK 与沙箱内部 envd 服务之间的通信认证。使用
envdAccessToken(从创建响应中获取),由 SDK 自动管理,用户无需手动处理。
API Key 认证
API Key 是最常用的认证方式,通过 Authorization: Bearer {api_key} 请求头发送到平台 API。
配置方式
1. 环境变量(优先于 ~/.abx)
export ABX_SANDBOX_API_KEY="your-api-key"
设置 ABX_SANDBOX_API_KEY。这是沙箱 API Key 唯一的环境变量。
2. 持久化文件(~/.abx/.env)
SDK 同样会读取 ~/.abx/.env,该文件由 abx CLI 写入(abx config set sandbox_api_key ...,文件权限 600;见 CLI 认证配置指南)。密钥存储为 ABX_SANDBOX_API_KEY。AccessKey 存储为 ALICLOUD_ACCESS_KEY_ID 和 ALICLOUD_ACCESS_KEY_SECRET。
3. .env 文件
在项目根目录创建 .env 文件:
ABX_SANDBOX_API_KEY=your-api-key
SDK 把两个 .env 当作各自独立的层读取。./.env 写了该键时优先;没写的键仍然来自 ~/.abx/.env。
- 当前目录下的
.env ~/.abx/.env
4. config.toml 文件
沙箱 API Key 放在 ~/.abx/.env(权限 600)。abx config set sandbox_api_key 把 ABX_SANDBOX_API_KEY 写在那里。非密钥的连接设置放在 ~/.abx/config.toml:
[transport]
sandbox_base_url = "https://api.cn-hangzhou.e2b.fc.aliyuncs.com"
sandbox_domain = "cn-hangzhou.e2b.fc.aliyuncs.com"
5. 代码参数(高于环境变量和 ~/.abx)
from agent_sandbox.api.sandbox import Sandbox
# 创建时直接传入
sandbox = await Sandbox.create(sandbox_api_key="your-api-key")
# 连接时直接传入
sandbox = await Sandbox.connect("sbx-xxxx", sandbox_api_key="your-api-key")
AK/SK 阿里云扩展认证 🧪
⚠️ 实验性功能:AK/SK → API Key 的 token 交换框架已在 SDK 中实现(
transport/auth.py),但 token 交换端点的 action 名称(CreateApiKey)和响应字段解析仍待 FC 平台团队确认。TTL(3600s)和提前刷新时间(300s)是占位值,要等平台确认端点之后才算数。当前可用于本地调试,生产环境仍推荐使用 API Key 认证。
AK/SK 模式使用阿里云 AccessKey 对,通过 token 交换获取临时 API Key(设计 TTL 3600 秒,到期前 300 秒自动刷新)。
配置方式
1. 环境变量
export ALICLOUD_ACCESS_KEY_ID="your-access-key-id"
export ALICLOUD_ACCESS_KEY_SECRET="your-access-key-secret"
这是 AccessKey 对唯一的环境变量。地域是 ALIBABA_CLOUD_REGION_ID。
2. 持久化文件(~/.abx/.env)
由 abx config set access_key_id ... / access_key_secret ... 写入(文件权限 600;见 CLI 认证配置指南),存储为 ~/.abx/.env 中的 ALICLOUD_ACCESS_KEY_ID=... / ALICLOUD_ACCESS_KEY_SECRET=...,SDK 会读取它。
3. 代码参数
sandbox = await Sandbox.create(
access_key_id="your-ak-id",
access_key_secret="your-ak-secret",
)
AK/SK 工作原理
- SDK 使用 AK/SK 通过阿里云 RPC (POP) V1 HMAC-SHA1 签名调用
https://fcsandbox.{region}.aliyuncs.com的 token 交换端点获取临时 API Key - 临时 Key 缓存在内存中(不持久化到磁盘)
- 设计有效期 3600 秒,SDK 在到期前 300 秒自动刷新(实际参数以 FC 平台最终确认为准)
- 后续请求使用临时 Key 作为 Bearer Token
注意:以上参数(TTL、端点 action 名等)基于 ACR token exchange 模式实现,正式上线前可能调整。
配置优先级链
认证凭证按以下优先级解析(从高到低):
flowchart TD
A["1. 代码参数 (sandbox_api_key= / access_key_id=)"] --> B["2. 进程环境变量"]
B --> C["3. ./.env(按键合并,没有的键继续往下)"]
C --> D["4. ~/.abx(.env,然后 config.toml)"]
D --> E["5. 内置默认值;沙箱密钥缺失时抛 InvalidAPIKeyError E1001"]
GitHub token 和区域走同一条链。空白或只含空格的值会被跳过。每个键只有一个环境变量。变量名和默认值见 凭证解析。
凭证与提供方
通用沙箱密钥(sandbox_api_key,环境变量 ABX_SANDBOX_API_KEY)和阿里云 AK/SK 属于内置提供方。切换到提供方插件后,除非插件的清单申请了它们且你在安装时同意,否则插件不会收到。插件有自己作用域的凭证键,例如提供方 my-cloud 的 ABX_MY_CLOUD_API_KEY。这样可以避免把一个云的密钥发给另一个云。
插件的每个选项都遵循同一条规则:规范名是 ABX_<PROVIDER_ID>_<FIELD>(连字符变下划线),清单可以用 env = [...] 把厂商自己的变量加为别名。密钥字段(secret = true)只存在于环境变量或 .env 文件(权限 0600),命令行上会被拒绝;其他字段也可以放在 config.toml 的 [providers.<id>] 下。2026-10-13 用 OpenSandbox 验证:只要 ABX_OPENSANDBOX_API_KEY 和 ABX_OPENSANDBOX_BASE_URL,CLI 和 SDK 都能驱动真实服务器;OPEN_SANDBOX_API_KEY 与 OPEN_SANDBOX_DOMAIN 是它声明的原生别名,两者同时设置时规范名优先。声明了 [core] inherit = ["sandbox_api_key"] 的插件,只有在你于安装时同意之后才会收到通用密钥;abx provider info <id> 会在「Inherits」下显示这份清单。
在同一层级内,API Key 优先于 AK/SK:
- 若同时提供了 sandbox_api_key 和 access_key_id,使用 API Key
- 若同时设置了 ABX_SANDBOX_API_KEY 和 ALICLOUD_ACCESS_KEY_ID,使用 ABX_SANDBOX_API_KEY
密钥存储(基于文件)
密钥存储在 ~/.abx/secrets.json 中,这是一个明文 JSON 文件,通过 chmod 600 文件权限保护。仅适合本地开发使用。
⚠️ 警告:
secrets.json以明文存储密钥。仅依赖 POSIX 文件权限(chmod 600)控制访问。生产环境请使用专用密钥管理服务。
通过环境变量或 .env 文件管理密钥,或向 Sandbox.create() 传入 envs={"MY_TOKEN": "..."} 为单个沙箱注入密钥:
# 通过环境变量设置 API Key(推荐)
export ABX_SANDBOX_API_KEY="your-api-key"
对应的 CLI 用法(abx config set、abx create --env)见 CLI 认证配置指南。
历史说明:macOS Keychain 集成已在过度设计清理中移除(ADR 2026-09-23)。
abx secretCLI 命令组也已被移除。所有密钥管理现通过环境变量、.env文件或abx config set(CLI 命令)完成。
envd 认证(沙箱内部通信)
沙箱创建后,与沙箱内部 envd 服务的通信使用 envdAccessToken(从创建响应中获取)。这是由 SDK 自动管理的内部机制,用户无需手动处理。
envd 认证需要以下 HTTP 头(已由 SDK 自动设置):
| Header | 值 |
|---|---|
X-Access-Token |
envdAccessToken |
E2b-Sandbox-Id |
沙箱 ID |
E2b-Sandbox-Port |
49983 |
Authorization |
Basic dXNlcjo= (base64 of "user:") |
常见问题
InvalidAPIKeyError (E1001)
[E1001] API key cannot be empty
Suggestion: Check your ABX_SANDBOX_API_KEY environment variable or pass sandbox_api_key.
解决:确保通过上述任一方式配置了有效的 API Key。
InvalidCredentialsError (E1003)
[E1003] AccessKey ID and Secret cannot be empty
Suggestion: Check ALICLOUD_ACCESS_KEY_ID and ALICLOUD_ACCESS_KEY_SECRET environment variables.
解决:确保同时设置了 AK ID 和 AK Secret。
TokenExpiredError (E1002)
[E1002] The SDK should auto-refresh tokens. If this persists, check system clock synchronization.
解决:检查系统时钟是否准确。SDK 会自动刷新 token,如果持续出现此错误,可能是时钟偏差过大。
相关:abx CLI
通过命令行设置凭证(abx config set / list / get、abx create --env)的说明位于 CLI 仓库:CLI 认证配置。