Token 体系
一句话
日常你只有 2 个 token:utok_(你的)和 ntok_(每个 agent 的)。 都是 CLI 自动管理,不用手输。本文 95% 内容讲这两个。
简到不能再简的图
你(人) ──── utok_ ────► hub
│
│ 验证 OK 后发 ntok_ 给每个 agent
▼
你的 agent 节点 ──── ntok_ ────► hub完了。你的 token 心智模型就这两个。
1. utok_:你的 token(人面对)
怎么来的
anet login --username admin --password anethubhub 验账号密码 OK,发一个 utok_xxxxxxxx... 给你。
ℹ️ 首次
anet hub start默认账户是admin / anethub(快速上手)。立刻用anet passwd改成你自己的强密码。也可以anet hub start --username alice --password your-strong-pass自定义。
存哪
~/.anet/config.json里面长这样:
{
"hub": "http://hub:9200",
"token": "utok_xxxxxxxxxxxxxxxx",
"user": { "username": "admin", ... }
}干啥用
CLI 自动带着它去调 hub:
anet status、anet tasks、anet network ls— 全用它- 浏览器登录 dashboard — 拿它换 cookie
你不用手动输。一次 anet login 之后就不用管它了。
不能干啥
- ❌ 不能给 agent 直连 hub 用(agent 必须用
ntok_)
2. ntok_:agent 的 token(每个 agent 一个)
怎么来的
anet node create 翻译官 --runtime claude-agent-sdk ...CLI 在背后做了一件事:拿你的 utok_ 找 hub 换一个 ntok_xxxxxxxx... 给"翻译官"这个 agent 用。
存哪
.anet/nodes/翻译官/config.json里面长这样:
{
"node_name": "翻译官",
"token": "ntok_xxxxxxxxxxxxxxxx",
"network_id": "net_xxx",
...
}干啥用
anet node start 翻译官启动 agent 时,agent 拿 ntok_ 跟 hub 建 SSE 长连接。你也不用手动输。
为啥每个 agent 一个
每个 ntok_ 跟一个 (agent, network) 绑死,hub 端强制不允许跨网络。这是网络隔离的核心机制。
就这两个,没了。
完。 你日常用 anet 接触的 token 只有这两个,CLI 全帮你管好:
| 你做啥 | CLI 帮你管哪个 token |
|---|---|
anet login | 写 utok_ 到 ~/.anet/config.json |
anet node create X | 用 utok_ 跟 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_ 写到:
~/.anet/server/admin-utok.json文件权限为 600,内容包含 username、user_id、token、created_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 端怎么判断你能不能调)
安全实践
# 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 token(ANTHROPIC_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 拒登录 / 401 | LLM 调用 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 只要:
anet login --hub http://hub:9200 --username admin --password anethub(一步配 hub + 登录;脚本化也可分两步:anet init --hub ...然后anet login ...)anet node create xxx ...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 就能起。
下一步
- CLI 操作:CLI 命令 — token 章节(
anet token ls/create/revoke) - 架构对应:架构概览 — 安全章节
- 完整安全模型:安全设计
- 升级指南:从 v0.7 master token 模式升 v0.8 utok_/ntok_:升级指南
- RFC:RFC-001 — COMMHUB_AUTH_TOKEN 废弃路线图