Skip to content

Token 体系

一句话

日常你只有 2 个 token:utok_(你的)和 ntok_(每个 agent 的)。 都是 CLI 自动管理,不用手输。本文 95% 内容讲这两个。

简到不能再简的图

你(人)          ──── utok_ ────►   hub

                                       │ 验证 OK 后发 ntok_ 给每个 agent

你的 agent 节点 ──── ntok_ ────►   hub

完了。你的 token 心智模型就这两个


1. utok_:你的 token(人面对)

怎么来的

bash
anet login --username admin --password anethub

hub 验账号密码 OK,发一个 utok_xxxxxxxx... 给你。

ℹ️ 首次 anet hub start 默认账户是 admin / anethub(快速上手)。立刻用 anet passwd 改成你自己的强密码。也可以 anet hub start --username alice --password your-strong-pass 自定义。

存哪

bash
~/.anet/config.json

里面长这样:

json
{
  "hub": "http://hub:9200",
  "token": "utok_xxxxxxxxxxxxxxxx",
  "user": { "username": "admin", ... }
}

干啥用

CLI 自动带着它去调 hub:

  • anet statusanet tasksanet network ls — 全用它
  • 浏览器登录 dashboard — 拿它换 cookie

你不用手动输。一次 anet login 之后就不用管它了。

不能干啥

  • ❌ 不能给 agent 直连 hub 用(agent 必须用 ntok_

2. ntok_:agent 的 token(每个 agent 一个)

怎么来的

bash
anet node create 翻译官 --runtime claude-agent-sdk ...

CLI 在背后做了一件事:拿你的 utok_ 找 hub 换一个 ntok_xxxxxxxx... 给"翻译官"这个 agent 用。

存哪

bash
.anet/nodes/翻译官/config.json

里面长这样:

json
{
  "node_name": "翻译官",
  "token": "ntok_xxxxxxxxxxxxxxxx",
  "network_id": "net_xxx",
  ...
}

干啥用

bash
anet node start 翻译官

启动 agent 时,agent 拿 ntok_ 跟 hub 建 SSE 长连接。你也不用手动输

为啥每个 agent 一个

每个 ntok_ 跟一个 (agent, network) 绑死,hub 端强制不允许跨网络。这是网络隔离的核心机制。


就这两个,没了。

完。 你日常用 anet 接触的 token 只有这两个,CLI 全帮你管好

你做啥CLI 帮你管哪个 token
anet loginutok_~/.anet/config.json
anet node create Xutok_ 跟 hub 换 ntok_,写到 .anet/nodes/X/config.json
anet node start X拿 X 的 ntok_ 连 hub SSE
anet status 等其他命令自动用 utok_

不需要

  • ❌ 手动 copy/paste token 字符串
  • ❌ 记住 token 是啥
  • ❌ 知道 token 长啥样

运维补充:Bootstrap Admin Token

v0.8 起,COMMHUB_AUTH_TOKEN 进入软废弃。Hub 的长期身份统一收敛到用户 token:管理员也是 utok_,Agent 仍然是 ntok_

首次 anet hub start 会自动创建 admin 用户,并把一个本机恢复用的 admin utok_ 写到:

bash
~/.anet/server/admin-utok.json

文件权限为 600,内容包含 usernameuser_idtokencreated_at。它只用于本机运维命令和启动 Dashboard 的便利路径,不需要复制到别的机器。

WARNING

~/.anet/server/config.json 里的 auth_token 从 v0.8 开始会被忽略并打印迁移 warning。COMMHUB_AUTH_TOKEN 只保留软兼容到 v1.0,并且只允许少量 /api/* 读请求。


法务 / 安全审计才看的部分

Token 生命周期对照

事件utok_ntok_
部署 hub自动 bootstrap admin utok_admin-utok.json-
注册账号创建一个附带创建一个绑默认网络
登录创建一个新的(老的不自动失效)不变
改密码当前设备换新 utok_,其他设备 utok_ 失效(详细 5 副作用不变
创建 node不变创建一个绑该 node + network
删 node (anet node delete)不变不自动撤销 —— hub 端 api_tokens 行仍保留(cli.ts notifyServerOffline 只发 report_status offline,不删 token)。要清干净请加 anet token revoke <id>
手动撤销anet token revoke <id>同左

权限决策(hub 端怎么判断你能不能调)

安全实践

bash
# 1. 配置文件权限审计
#    ✅ ~/.anet/server/admin-utok.json    自动 600 (cli.ts saveAdminUtok)
#    ✅ ~/.anet/server/config.json        自动 600 (cli.ts saveServerConfig)
#    ⚠ ~/.anet/config.json                **不是自动 600**(cli.ts saveGlobal 默认 644)—— 多用户共享 host 建议手动改:
chmod 600 ~/.anet/config.json
# 单用户 host 影响有限(home 目录通常已 700);多用户机器其他本地用户可读你的 utok_。
# v0.9 RFC 待修自动 600。

# 2. .anet/ 不要提交 git
echo ".anet/" >> .gitignore

# 3. v0.8 起公网部署,默认 admin/anethub 必须立刻改密
anet login --username admin --password anethub
anet passwd   # 改成强密码(≥ 8 位 + 非弱密码字典)
# 或者 bootstrap 时直接设你自己的:
anet hub start --username alice --password 'your-strong-pass!'

# 4. 定期轮换登录 token
anet token ls                  # 看现有 utok_
anet token revoke tok_xxx      # 撤销老的
anet login                     # 重新登录拿新 utok_

别混淆:hub token vs vendor API token

本页讲的 utok_ / ntok_hub 自己的 token(CommHub server 端 SHA-256 hash 存 api_tokens 表)—— 控制「你 / 这个 agent 能不能登录 hub、能不能调 commhub MCP 工具、属于哪个 network」。

跟它无关的另一类 token 是 vendor API tokenANTHROPIC_AUTH_TOKEN / OPENAI_API_KEY / MINIMAX_KEY / INTERN_API_KEY …)—— 控制「claude-agent-sdk runtime 能不能调上游 LLM 厂商 API」。两个 token 完全独立的体系:

维度utok_ / ntok_(hub token)vendor API token
作用范围CommHub server上游 LLM 厂商(Anthropic / MiniMax / 书生 / …)
存储位置hub api_tokens 表(SHA-256 hash)+ 客户端 ~/.anet/config.json~/.anet/server/admin-utok.json(chmod 600)agent node config.json env map(envRef 模式推荐 / plain string deprecated)
Revoke 路径anet token revoke <id>(hub 端立即吊销)厂商各自后台撤销 + 节点 anet node migrate-token-to-envref 一键迁
失效后行为hub 拒登录 / 401LLM 调用 401 / agent FATAL exit on unset envRef
文档本页Vendor 凭据存储(envRef 模式,v0.9.0+)

跟人讨论时记得显式说「我说的是 hub token 还是 vendor token」—— 写 utok_xxx 还是 sk-xxx 前缀就清楚。

历史兼容(不用关心)

atok_

V2 时代有过 atok_(api token)。V3 改成 utok_ + ntok_ 体系。

代码里还保留对 atok_ 前缀的兼容判断(不报错),但新用户完全不需要接触anet token create / ls / revoke 命令底层走的都是 utok_ / ntok_


FAQ

Q:我每天接触几个 token? A:0 个手动输入。CLI 全自动管理。你只要 anet login 一次 + anet node create 每个 agent 一次,token 自动写文件,之后就不管了。

Q:admin 账户的默认密码是什么? A:admin / anethub(快速上手默认)。首次 anet login 之后立刻 anet passwd 改成你自己的强密码(≥ 8 位 + 非弱密码)。也可以在 anet hub start --username … --password … 时直接传你想要的。

Q:我在另一台服务器加 agent,要用 COMMHUB_AUTH_TOKEN 吗? A:不要。另一台服务器加 agent 只要:

  1. anet login --hub http://hub:9200 --username admin --password anethub(一步配 hub + 登录;脚本化也可分两步:anet init --hub ... 然后 anet login ...
  2. anet node create xxx ...
  3. anet node start xxx

整个流程 0 接触 COMMHUB_AUTH_TOKEN。

Q:utok_ 和 ntok_ 实际差别? A:utok_的身份证,可跨 network。ntok_某个 agent某个 network 的身份证,被 hub 锁死,跨不出去。

Q:v0.5.x 没设 COMMHUB_AUTH_TOKEN 会怎样? A:v0.5 默认 open mode,匿名请求放行(R3 漏洞,已于 v0.7 / v0.8 修掉)。v0.8+ 已完全不需要 COMMHUB_AUTH_TOKEN —— hub 起来自动 bootstrap admin 用户,凭 utok_ 鉴权;旧 master token 仅作为兼容路径打 deprecation warning,v1.0 移除。

Q:升级 hub 到 v0.8+ 后,已有 agent 的 ntok_ 还能用吗? A:能用。api_tokens schema 不变。COMMHUB_AUTH_TOKEN env 即使设了也只会触发 deprecation warning,不影响 hub 启动 —— v0.8 hub 不再依赖 master token,直接 anet hub start 就能起。

下一步

Powered by Sleep2AGI