CLI
登录态 Token
通过 ncoder 向常驻后端注入用户登录态 token,让 Agent 工具 CLI 带身份运行。
North Coder 嵌入小北统一产品 shell 后,shell 通过 ncoder 把当前用户的登录态 token(默认 NORTH_AUTH_TOKEN)注入常驻后端内存。后端在会话 Agent 调起工具 CLI 时,把它作为环境变量注入子进程,使依赖登录态的 CLI 能带用户身份运行。
后端只做纯透传管道:不验签、不解析、不管过期,token 只存在进程内存中,不落盘,重启即清空。这不是 SSO/OIDC——签发与刷新由 shell 负责。
需要从宿主程序而非 CLI 直接调用?同样的能力通过 HTTP 控制面暴露,见 HTTP API — 登录态 Token。
快速使用
# 注入(shell 在启动、重连、token 刷新时执行)
printf '%s' "$NORTH_AUTH_TOKEN" | ncoder login
# 注销时清除
ncoder logout- token 值只从 stdin 读取,绝不作为命令行参数传入,避免泄漏到
ps输出或 shell 历史。 - 后端只把 token 存在进程内存里,绝不写入磁盘。
- 下一次 Agent 工具运行时,token 作为环境变量
NORTH_AUTH_TOKEN注入它调起的 CLI 子进程。
命令
| 命令 | 行为 |
|---|---|
ncoder token set <NAME> | 从 stdin 读取 token 值;幂等写入条目 <NAME>(覆盖式)。 |
ncoder token ls | 列出条目:名称 + 脱敏值 + updated_at(绝不显示原值)。 |
ncoder token rm <NAME> | 删除条目 <NAME>。 |
ncoder login | ncoder token set NORTH_AUTH_TOKEN 的语法糖。 |
ncoder logout | ncoder token rm NORTH_AUTH_TOKEN 的语法糖。 |
<NAME> 必须是合法的环境变量标识符([A-Za-z_][A-Za-z0-9_]*)。表的键名就是注入到 Agent 工具 CLI 的环境变量名。
ncoder 是一层很薄的 HTTP 客户端,这些命令通过标准服务发现(或 --server / NC_SERVER + --token / NC_TOKEN)定位常驻后端,调用 /api/runtime-tokens 控制面端点。
stdin 约定
- token 值从 stdin 读取,仅剥离结尾的换行符(
\n及其前导\r),其余字符原样保留。登录态 token 是不含空白的不透明串,所以剥行尾是安全的。 - 空 stdin 是硬错误,不会注入空白 token。
- 绝不把 token 放进 argv(不支持
ncoder login "$TOKEN")。stdin 让密钥不进入ps输出和 shell 历史。
推荐写法:
printf '%s' "$NORTH_AUTH_TOKEN" | ncoder login # 无尾换行
echo "$NORTH_AUTH_TOKEN" | ncoder login # 尾换行被剥离
ncoder login < /run/secrets/north_auth_token # 从密钥文件读取注入契约(出站)
- 对表中每个条目
name → value,后端在每次会话 Agent 工具运行时,把name=value设入 Agent 工具 CLI 子进程的环境。 - 默认名
NORTH_AUTH_TOKEN对齐小北生态约定,下游 CLI 无需改动即可读取。 - 环境每次工具运行重建,所以
ncoder login在下一次 Agent 运行生效;进行中的运行不受影响。 - 作用域仅限 Agent 工具 CLI——用户交互终端(PTY)和 MCP server 子进程不注入。
运维规则(供 shell 对接)
- 启动即注入。 后端每次(重)启动后表都是空的。shell 在每次(重)连接、检测到新后端时必须(重)注入 token。
- 刷新/过期时重注入。 后端不验签也不解析过期——纯透传。token 轮换或过期时,shell 必须用
ncoder login推送新值(幂等覆盖)。过期 token 会让下游 CLI 调用失败,直到重新注入。 - 不要依赖持久化。 token 永远不会跨后端重启留存(这是有意的安全边界)。把注入当作幂等且廉价的操作。
- 注销即清身份。
ncoder logout删除条目,后续 Agent 运行不再携带NORTH_AUTH_TOKEN。
安全要点
- 仅内存:表绝不序列化到
state.json、config.json或任何 SQLite,进程重启即清空。 - 绝不回显原值:
token ls与GET只返回脱敏预览(固定 8 个*+ 末 4 位,极短 token 全打码)和updated_at。 - 值只经 stdin(入站)和
PUTbody(走 loopback)传输,绝不经 argv 或 URL 路径/查询。
完整设计见 RFC-0091;shell 对接契约见仓库内
docs/integrations/ncoder-login-token-injection.md。