安全与权限
API 认证
如何通过本机 CLI 签发 Bearer Token,并用它访问 Downcity API
API 认证
Downcity 现在只保留一种对外认证模型:
- 不再提供用户名 + 密码登录
- 不再提供浏览器 session
- 统一使用 Bearer Token
- token 只由本机终端里的 CLI 管理
当前已经落地的接口是:
GET /api/auth/statusGET /api/auth/meGET /api/auth/token/listPOST /api/auth/token/createPOST /api/auth/token/delete
第一次使用
如果你执行:
town start --console首次启动时,Downcity 会自动初始化一个本机 token,并在启动日志里显示一次明文 token。启动日志里会看到类似输出:
$ town start --console
town v1.0.0
✅ Town runtime started
pid: <runtimePid>
log: <bayRuntimeLogPath>
✅ Console started
pid: <consolePid>
url: http://127.0.0.1:5315
log: <consoleLogPath>
✅ Console token initialized
subject: local-cli
name: console-bootstrap
token: dc_xxx
next: 把上面的 Bearer Token 粘贴到 Console UI / Extension如果你想手动签发 token,可以直接在本机终端执行:
town token create my-token这里的名称只是便于你自己识别和管理,不代表不同权限或不同渠道类型。
如果你想直接走交互模式,也可以执行:
town token交互式模式会继续引导你:
- 创建完成后直接复制刚签发的 token
用 Token 调用接口
拿到 token 后,统一放进 Authorization 头:
curl http://127.0.0.1:3000/api/auth/me \
-H 'Authorization: Bearer dc_xxx'如果 token 有效,接口会返回当前主体、角色和权限。
用 CLI 管理 Token
列出当前机器已签发的 token:
town token list创建一个新的 token:
town token create my-token删除 token:
town token delete <tokenId>如果你更习惯直接调用 HTTP,也可以继续用 Bearer Token 管理 token:
curl http://127.0.0.1:3000/api/auth/token/list \
-H 'Authorization: Bearer dc_xxx'curl -X POST http://127.0.0.1:3000/api/auth/token/create \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer dc_xxx' \
-d '{
"name": "chrome-extension"
}'curl -X POST http://127.0.0.1:3000/api/auth/token/delete \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer dc_xxx' \
-d '{
"tokenId": "token_record_id"
}'DC_AUTH_TOKEN
先说结论:
- 只有对外 HTTP 调用才需要 Bearer Token
- 本地托管命令现在默认也是通过本地 agent daemon 的 HTTP 端点访问
对于直接调用 API 的用户,只需要记住一条:
- 对外调用统一使用
Authorization: Bearer <token>
但在 CLI/runtime 里,真正需要关心的环境变量只有一个:
| 变量 | 面向谁 | 作用 |
|---|---|---|
DC_AUTH_TOKEN | 用户、脚本、CI | 显式指定“这次 CLI/API 调用用哪个 token” |
只有当前 HTTP 端点需要鉴权时,CLI 才会进入下面的 token 解析顺序:
--tokenDC_AUTH_TOKEN
所以:
DC_AUTH_TOKEN是显式覆盖- 受保护的 HTTP 调用最终会把
DC_AUTH_TOKEN归一化为 Bearer Token 请求头
如果你看到 Missing bearer token:
- 不要先怀疑
sessionId - 先确认目标 HTTP 端点当前是不是启用了鉴权
- 再检查当前进程有没有可用 token 来源
- 如果是在 agent/Bash/ACP 子进程里,先确认这条命令是否需要显式传入 token
当前边界
当前模型就是 token-only:
- 已移除用户名 + 密码登录
- 已移除
bootstrap-admin - 已移除
login - 已移除
password/update - Console UI、Chrome Extension、外部脚本统一使用显式签发的 Bearer Token
后续如果增加新的接入面,也会继续沿用这套 Bearer Token 模型,而不是再引入单独的登录 session。