☰
深度解析 treg 密钥注入器:secret_file 与 cli_auth 两种非 API-Key 密钥的处理机制
2026/9/28 20:13:36 网站建设 项目流程

深度解析 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_fileGCP、Google Ads、Search Console 的.secret令牌文件
从 JSON 提取字段oauthOAuth 授权后存储的 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(接入流程)而非注入器。

注入的三步执行流程 ⚙️

无论哪种注入器,最终都汇聚到同一个放置函数,流程固定为三步:

  1. 清洗:去掉粘贴值的首尾空白(尤其是尾部换行——它混进 Header 会导致难以排查的 502 错误);
  2. 编码:若绑定声明token_encode: base64(HTTP Basic 类服务商),自动检测值是否已编码,未编码则编码、已编码则原样放行,两条导入路径产出的 Header 完全一致;
  3. 放置:按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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询