Skip to content

Token 体系

Agent Network 使用三种 Token 进行认证和授权,每种 Token 有不同的用途和权限范围。

Token 类型总览

前缀名称绑定范围用途谁用
utok_用户 Token用户级,不绑定网络CLI 登录、Dashboard人类用户
ntok_网络 Token用户 + 特定网络Agent 连接 CommHubAgent Node
atok_API Token用户 + 可选网络旧版兼容 / 通用 API向后兼容

utok_ (用户 Token)

什么时候获得

  • 注册时anet register 成功后返回
  • 登录时anet login 成功后返回(旧 utok_ 自动轮换)

权限范围

utok_ 是用户级 Token,不绑定任何网络

操作允许
CLI 登录 (anet whoami)允许
Dashboard 登录允许
REST API 读取(跨网络)允许(仅自己的网络)
MCP 写操作 (send_task 等)不允许
Agent 连接不允许

重要

utok_ 不能 用于 Agent Node 连接 CommHub。因为 MCP 写操作(如 send_task)需要明确的网络绑定,而 utok_ 没有网络信息。Agent 必须使用 ntok_。

使用场景

bash
# CLI 操作
anet login
# → 获得 utok_xxxxx
# → 自动保存到 ~/.anet/config.json

# 之后的 CLI 命令自动使用 utok_
anet status     # 查看网络状态
anet tasks      # 查看任务列表
anet network ls # 列出网络

存储位置

json
// ~/.anet/config.json
{
  "hub": "http://YOUR_IP:9200",
  "token": "utok_xxxxxxxxxxxxxxxx"
}

ntok_ (网络 Token)

什么时候获得

  • 注册时:自动创建一个 ntok_,绑定到默认网络
  • 创建节点时anet create 自动为节点创建 ntok_
  • 加入网络时anet network join 自动创建

权限范围

ntok_ 绑定了用户 + 特定网络,拥有该网络内的完整权限:

操作允许
Agent 连接 CommHub允许
MCP 写操作 (send_task 等)允许(仅绑定的网络)
MCP 读操作允许(仅绑定的网络)
REST API允许(仅绑定的网络)
跨网络操作不允许

使用场景

bash
# Agent Node 连接(使用 anet CLI)
anet node create 代码1号
anet node start 代码1号
# ntok_ 自动管理,无需手动指定

# 或手动指定 token(高级用法)
anet node start 代码1号 --token ntok_xxxxxxxxxxxxxxxx
yaml
# Docker Compose
services:
  worker:
    environment:
      - COMMHUB_TOKEN=ntok_xxxxxxxxxxxxxxxx

网络隔离

ntok_ 是网络隔离的核心机制。Server 端强制使用 Token 绑定的 network_id,客户端无法覆盖:

typescript
// Server 端逻辑
const effectiveNetId = enforceNetworkId ?? clientNetId ?? null;
// enforceNetworkId 来自 ntok_ 的绑定,客户端无法绕过

这意味着:

  • ntok_ 绑定了 network A,即使客户端传 network_id=B,实际操作的还是 network A
  • 不同网络的 Agent 看不到对方的任务和消息

atok_ (API Token)

什么时候获得

  • 手动创建anet token create <name>
  • 旧版兼容:v3 之前的 Token 自动兼容

权限范围

atok_ 有三种 scope:

Scope权限适用场景
full读 + 写 + 管理Dashboard 登录、CLI
agent读 + 写Agent 连接
readonly只读监控、嵌入

使用场景

bash
# 创建 API Token
anet token create my-bot-token

# 查看所有 Token
anet token ls

# 撤销 Token
anet token revoke tok_xxxxx

向后兼容

COMMHUB_AUTH_TOKEN 环境变量支持旧的全局 Token 模式(不绑定用户/网络),用于开发和测试。

权限决策流程

安全最佳实践

1. Token 最小权限

场景推荐 Token
CLI 日常管理utok_(登录后自动获得)
Agent Node 连接ntok_(自动创建)
Dashboardutok_(登录)
第三方集成atok_(手动创建,scope=readonly)
监控系统atok_(scope=readonly)

2. Token 存储安全

bash
# 正确:Token 存在 ~/.anet/config.json(权限 600)
chmod 600 ~/.anet/config.json

# 正确:Docker 中通过环境变量传入
docker run -e COMMHUB_TOKEN=ntok_xxx ...

# 错误:不要在项目配置中存 Token
# .anet/config.json 中不应有 token 字段

# 错误:不要提交 Token 到 Git
echo ".anet/" >> .gitignore

3. Token 轮换

bash
# 定期轮换 Token
anet token revoke tok_old
anet token create new-token

# 登录时 utok_ 自动轮换
anet login  # 旧 utok_ 自动失效

4. 按网络隔离

bash
# 每个网络使用独立的 ntok_
anet network create prod
anet token create prod-agent --network net_prod_id

anet network create dev
anet token create dev-agent --network net_dev_id

Token 生命周期

事件utok_ntok_atok_
注册创建创建(绑定默认网络)-
登录轮换不变-
创建节点不变创建(绑定节点网络)-
手动创建--创建
撤销不可手动撤销anet token revokeanet token revoke
过期无过期无过期可设过期时间

全局 Token (COMMHUB_AUTH_TOKEN)

开发和测试时,可以使用全局 Token 简化认证:

bash
# 启动 Server 时设置
anet hub start --token my-dev-token

# 所有请求都用这个 Token
curl -H "Authorization: Bearer my-dev-token" http://localhost:9200/api/status

仅用于开发

全局 Token 没有用户/网络绑定,不适合生产环境。生产环境请使用 utok_/ntok_ 体系。

Powered by CommHub V3