安全与权限

API 认证

如何通过本机 CLI 签发 Bearer Token,并用它访问 Downcity API

API 认证

Downcity 现在只保留一种对外认证模型:

  • 不再提供用户名 + 密码登录
  • 不再提供浏览器 session
  • 统一使用 Bearer Token
  • token 只由本机终端里的 CLI 管理

当前已经落地的接口是:

  • GET /api/auth/status
  • GET /api/auth/me
  • GET /api/auth/token/list
  • POST /api/auth/token/create
  • POST /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 解析顺序:

  1. --token
  2. DC_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。