00:00:00这是 Valor,一款用于管理环境变量的开源工具,它能让你
00:00:04再也不用在磁盘上存储明文机密信息。它的工作原理是
00:00:10在本地或通过 1Password、Bitwarden、AWS 等密码管理器解析环境变量。
00:00:16通过使用类型安全架构,它会在运行时将机密注入你的应用程序,
00:00:21使你的 .env 文件对于 AI 甚至是公开提交到 GitHub 都是安全的。但它究竟是如何运作的,
00:00:27这种奇怪的语法又是怎么回事?点击订阅,让我们开始深入了解。
00:00:31有多少次当你开始一份新的开发工作,拿到了代码并尝试在本地运行,
00:00:39却发现因为它无法运行,仅仅是因为你缺少了需要从另一位开发者
00:00:45或某种加密存储中获取的 .env 文件?而且每次 .env 文件更新时,
00:00:50你都得一遍又一遍地重复这个过程。这正是 Valor 致力于解决的问题,同时也为了解决
00:00:56提示词注入的 AI 代理获取了它们本不该访问的机密信息的问题。让我们来看看它是如何运作的。
00:01:02这里有一个我一直在开发的小项目,它能通过 Twitter 视频生成文章,
00:01:06使用 OpenAI 的 Whisper 来转录视频,并使用 Claude 来撰写文章。
00:01:12但我们要先从简单的开始,使用 Valor 来更改端口号。安装好 Valor 后,
00:01:17我们应该有一个目前为空的 .env 架构文件。这将是
00:01:23我们所有环境变量的唯一事实来源,并且可以提交到 GitHub 的公共仓库中。
00:01:28我们首先添加一个简单的 appenv 环境变量,并将其值设为 “testing”。
00:01:33现在我可以新建一个标签页来运行 varlock load,这将验证我们的架构。现在
00:01:39我们可以看到它读取了我们的环境变量,并将其设为 “sensitive”(敏感)。
00:01:43这是因为 varlock 中所有的环境变量默认都被设为敏感,但我们可以更改这一点。
00:01:48在这个文件中,我要添加第一个装饰器,它将是一个 root(根)装饰器,
00:01:52因为它会影响文件中所有的环境变量,我们将 default sensitive 设置为 false。
00:01:56注意这里的语法前面有一个井号,通常根变量会用分隔符隔开。
00:02:02现在整个文件使用一种名为 mspec 的特定领域语言,
00:02:08这是 varlock 团队编写的开放规范。现在如果我再次验证架构,我们就能看到
00:02:14环境变量的具体数值了,因为它不再被标记为敏感。但我们还可以
00:02:19在架构文件中做其他很酷的事情,比如给环境变量指定类型。所以
00:02:24我会给它一个 string 类型,这意味着一切仍然正常;但如果我把它改成
00:02:29number 类型,我们可以看到报错了,因为它期望得到的是字符串。我还可以
00:02:33给它添加 required(必填)装饰器,然后删除这些文本,这意味着如果我们检查文件,就会报错,
00:02:39因为它需要一个值。这些被称为项装饰器,你可以在
00:02:44varlock 文档中找到它们的完整列表以及所有可用类型。现在让我们添加另一个
00:02:50环境变量,这次我们叫它 port,值为 3002。我可以给它
00:02:55一个 port 类型。我还要在上面把这个设为敏感,并将这个改回
00:03:01string 类型。现在它识别出了我们的两个环境变量,并因为敏感设置隐藏了这一个。
00:03:05那么,我们该如何将这些值注入到应用程序中呢?我们只需要运行
00:03:10varlock run,后面跟上运行应用程序所需的脚本。如果我们查看 package.json 文件,
00:03:15可以看到我们需要运行 vite 命令来启动前端。所以现在如果我运行 varlock run
00:03:21加上 vite 命令,它就会加载配置、进行解析,然后将其注入到我们的
00:03:27环境变量中,这正是它所做的。因为现在端口是 3002,这在我们的代码中是可行的,
00:03:33因为它会首先检查目前由 varlock 注入的 port 环境变量。
00:03:38这个脚本不一定非得是 JavaScript 文件,因为 varlock 适用于任何项目,
00:03:43Python、Go、Rust,随你挑,一切都会如预期般运作。如果你不想
00:03:48通过 npm 安装,还有一个 varlock CLI,用法完全一样。这些对于
00:03:54本地环境变量来说都很棒,但现在让我们来看看从 1Password 获取变量的过程,
00:03:59而不是使用我 shell 里的本地变量来存放像 OpenAI 和 Anthropic API 密钥这样的东西。
00:04:05我个人并不使用 1Password,我只是为了制作这个视频注册了一个试用版。但如你
00:04:11所见,我创建了一个新保险库(Vault),这非常重要,我稍后会解释原因。在这个
00:04:16保险库里,我们有两个项目:一个是 OpenAI API 密钥,一个是 Anthropic API 密钥。
00:04:24我不介意展示它们,因为它们完全是编造的;如果我揭示它,你会看到这并不是真实的 API 密钥。
00:04:30为了在 varlock 架构中获取这些值,我们首先需要安装 1Password 插件。
00:04:36请注意,varlock 的插件可以添加它们自己的根装饰器和项装饰器,所以你可能会在这里看到
00:04:42一些文档中没有的新装饰器,例如这个 init one password 装饰器。所以在
00:04:49安装完 varlock 1Password 之后,我们可以加载包含刚刚安装的插件的根装饰器,
00:04:55并运行 init one password 装饰器。我现在需要的只是这个令牌,
00:05:01我可以从这里加载。为了获取这个令牌,你确实需要将其连接到一个新保险库,
00:05:06而不是你的个人保险库。你可以在开发者服务账号中找到它,然后按照步骤
00:05:11创建一个令牌。由于我会在这个视频之后删除我的令牌和 1Password 账号,
00:05:15所以我不介意展示它。我将给它一个 one password service token 类型,它被设置为
00:05:21敏感,并且是来自该插件的一种类型。你可能还注意到这个文件
00:05:26没有任何语法高亮,这是因为 varlock 团队虽然创建了一个支持它的 VS Code 插件,
00:05:32但目前还没有针对 Neovim 的插件,这意味着我将来可能会创建一个,或者直接让 Claude 来做。
00:05:37现在我要创建一个名为 openai api key id 的新环境变量,
00:05:43为了从 1Password 获取它,我必须运行 one password 函数,
00:05:49后面跟着这个协议,然后我需要添加我的保险库名称(test),
00:05:55项目名称(openai),然后是字段名称。如果我们再次核对,可以看到这里是
00:06:02credential。我也可以将其设置为敏感。现在如果我们运行 varlock load,它需要几秒钟
00:06:08从 1Password 获取我的 OpenAI API 密钥。我们可以通过更改这里的
00:06:14值(比如 1234)来检查它是否在工作。如果我们再次运行 varlock load,它会获取正确的
00:06:20数值。大功告成,我们的 env 架构文件现在可以放心提交了。但我知道你在
00:06:25想什么:这个 1Password 令牌安全吗?说实话,如果你是在
00:06:31本地开发并且安装了 1Password,你可能已经安装了桌面版应用或者正在使用命令行。
00:06:38在这种情况下,你可以使用这种配置来通过指纹解锁 1Password,而不是使用
00:06:431Password 令牌。但 varlock 还支持其他插件,比如 AWS、GCP 甚至是 Bitwarden,
00:06:52以及许多其他集成,包括 Vite、Next.js 和 Cloudflare Workers。还有
00:06:57很多其他功能我还没来得及介绍,比如根据你的架构生成 TypeScript 类型,
00:07:03从其他文件导入环境变量,甚至可以从日志和传出的 HTTP 响应中
00:07:08脱敏敏感输出,这是一个非常贴心的设计。甚至还有一个 MCP 服务器来
00:07:15帮助你的编程代理自动为你设置 env 架构,还有一个 GitHub Action
00:07:21在 CI/CD 流程中加载并验证你的环境变量。但尽管 varlock 很酷,
00:07:27它还是有一些问题的。例如,你无法离线使用它;如果你在机场写代码,
00:07:32你就必须使用硬编码的环境变量。但老实说,现在谁写代码不联网呢?
00:07:37另外说到网络,从不同的供应商获取密码时会有一定的延迟,
00:07:41所以启动脚本会稍微慢一点。此外,
00:07:46它还缺乏对 Dashlane 等其他供应商的支持。而且我确实遇到了一个奇怪的 bug:如果我在
00:07:53架构文件中使用了与本地 shell 环境变量相同的名称,它就会优先使用本地的环境变量,
00:07:59而不是 1Password 中的那个。但 varlock 正在积极开发中,
00:08:05我相信很多这类问题将来都会得到解决。尽管如此,
00:08:10目前这个产品对我来说仍然非常有用,我想我之后所有的
00:08:16个人项目都会使用它,甚至如果以后有办法的话,用 varlock 架构文件
00:08:21取代我本地的 shell 文件。我真心希望能实现,因为我不想让任何 AI 代理
00:08:26搜刮到我的信息。