深度解析 treg 密钥注入器:secret_file 与 cli_auth 两种非 API-Key 密钥的处理机制
【免费下载链接】tregOpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn项目地址: https://gitcode.com/GitHub_Trending/treg/treg
在treg(面向 Agent 工具的密钥代理平台)中,并非所有上游服务都用普通 API-Key 鉴权。treg 通过一套密钥注入器(Injector)机制,统一处理secret_file和cli_auth这类非 API-Key 类密钥:前者从 JSON 令牌文件中自动提取 token,后者复用你本地 CLI(如 gh、stripe)已有的凭证。本文带你快速看懂这套设计的核心思路与安全细节。
为什么需要"注入器"?🔐
大多数 API 用Authorization: Bearer <key>就能搞定,但现实中有两类麻烦场景:
- JSON 令牌文件:Google、GCP 等服务把凭证存成包含
access_token、refresh_token等字段的 JSON 文件,你不能把整个文件原样发给上游; - CLI 本地凭证:一些工具(GitHub CLI、Stripe CLI)把密钥存在本机 keychain 或配置里,格式各异。
如果让代理核心为每种凭证形态写分支逻辑,代码会迅速失控。treg 的解法是把"注入"抽象成一个可注册的插槽:代理永远不关心密钥长什么样,只按绑定(binding)声明调用对应的注入器函数。相关实现见 src/treg/infra/upstream/injectors.py。
四种注入器,两套机制
treg 内置四种注入器,归为两种"取料"机制:
| 机制 | 注入器 | 适用场景 |
|---|---|---|
| 放置字符串 | env | 普通粘贴的 API-Key(Bearer/X-Api-Key) |
| 放置字符串 | cli_auth | 从 CLI 配置/keychain 提取的凭证 |
| 从 JSON 提取字段 | secret_file | GCP、Google Ads、Search Console 的.secret令牌文件 |
| 从 JSON 提取字段 | oauth | OAuth 授权后存储的 token JSON |
核心思想一句话:加一种新密钥形态 = 加一个函数,代理核心零改动。
secret_file:自动从 JSON 令牌文件取 token
secret_file注入器的行为很直白:把存储的 JSON 密钥解析后,按绑定声明的secret_field(默认access_token)取出一个字段,再交给统一的放置逻辑(Header / Query 参数 / JSON Body)。
它的严谨之处在于防御垃圾值:
- JSON 解析失败 → 明确报错"不是合法 JSON",而不是发出必然 401 的请求;
- 字段缺失 → 报错"字段未找到";
- 字段是
bool/null/对象等类型 → 拒绝注入,避免把"None"、"True"这类垃圾当凭证发给上游。
配合导入工具 src/treg/convert.py 中的find_secret_file():当你在技能目录下用--dir导入时,它会自动在.secret/、.secrets/目录里按类型匹配文件(JSON 令牌文件匹配secret_file/oauth,纯文本匹配env/cli_auth),恰好一个匹配则成功,多个匹配则提示用--file手动指定,杜绝"悄悄拿错文件"。
cli_auth:复用 CLI 已有的凭证
cli_auth的注入端和env完全一样——都是"把一个字符串放到指定位置",区别在于取料发生在导入阶段:treg 从 CLI 工具自己的配置文件或系统 keychain 中提取凭证(例如 gh 的 token、stripe 的密钥),加密后入库。
这意味着:
- 注入路径保持"愚蠢"(dumb),不需要知道凭证来自哪个 CLI;
- 提取逻辑与导入流程解耦,代理热路径上零额外 IO;
- 项目文档 docs/context/architecture/auth-secrets.md 中明确记录了这类凭证的获取归属是 onboarding(接入流程)而非注入器。
注入的三步执行流程 ⚙️
无论哪种注入器,最终都汇聚到同一个放置函数,流程固定为三步:
- 清洗:去掉粘贴值的首尾空白(尤其是尾部换行——它混进 Header 会导致难以排查的 502 错误);
- 编码:若绑定声明
token_encode: base64(HTTP Basic 类服务商),自动检测值是否已编码,未编码则编码、已编码则原样放行,两条导入路径产出的 Header 完全一致; - 放置:按
location写入 Header、Query 或 JSON Body 顶层字段;同名参数会被注入值覆盖,注入的凭证永远赢过调用方自带的同名参数。
这套行为有完整的单元测试覆盖,见 tests/test_injectors.py。
安全细节:密钥全程不落地 🛡️
- 静态加密:所有密钥值(包括
secret_file和cli_auth来源的)在数据库中以 Fernet 加密存储,密钥来自TREG_SECRET_KEY,未设置时退化为临时密钥——重启即失效,以此"大声提醒"部署者必须配置正式密钥,详见 src/treg/crypto.py; - 值永不回传:接口只返回密钥元数据,完整值唯一的合法出口是本地运行授权(local-run grant),且 OAuth 场景只放行短命的 access token,
refresh_token/client_secret永不出服务器; - 所有权边界:成员只能绑定自己拥有的密钥,防止把队友的密钥洗进自己控制的工具里再外泄。
相关资源
- 注入器核心实现:src/treg/infra/upstream/injectors.py
- 架构文档(Auth & secrets):docs/context/architecture/auth-secrets.md
- 密钥类型与数据模型:docs/context/architecture/data-model.md
- CLI 接口说明(secret add / kind 参数):docs/context/interface/cli.md
- 注入器单元测试:tests/test_injectors.py
- 术语表(Secret / 四种 kind):docs/context/reference/glossary.md
小结:treg 用"注册表 + 两机制"的注入器设计,让secret_file的 JSON 令牌提取与cli_auth的 CLI 凭证复用都变成声明式配置——代理核心保持简单,新密钥形态即插即用,而加密存储与所有权校验保证了密钥全程安全。
【免费下载链接】tregOpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn项目地址: https://gitcode.com/GitHub_Trending/treg/treg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考