# 机密 (/zh/docs/workspaces/secrets)

机密是一个值保留在你 Mac 钥匙串中的变量。工作区文件里只有它的名称，因此你可以提交并分享工作区，而不会分享你的凭据。密码、令牌、API 密钥，以及任何你不会粘贴到聊天里的内容，都应该用机密。

## 把变量设为机密 [#make-a-variable-secret]

1. 打开变量表：[环境](/docs/workspaces/environments)页面、**文件夹设置… › 变量**，或请求的**变量**标签页。
2. 添加变量，或找到它，然后勾选**密钥**。
3. 在字段中输入值（字段显示**未在这台 Mac 上设置**），然后按 <kbd>↩</kbd> 或点按**存储**。

字段永远不会再次显示这个值。一旦有了值，它会显示带钥匙图标的**存储在钥匙串中**。要更改值，请输入一个新值并存储。

使用机密就像使用任何变量一样：`{{token}}`。

<Shot id="workspaces-secret-variable" alt="“环境”页面上的工作区变量：token 已标记为密钥，其值字段显示“存储在钥匙串中”" />

在文件中，机密只有名称和一个标志，没有值：

```toml
[[variables]]
name = "token"
secret = true
```

每个层级都保存自己的值。Staging 环境中的机密 `password` 和 Production 中的是两个钥匙串项，所以每个环境都可以有自己的密码。

## 值保存在哪里 [#where-the-values-live]

值保存在你的登录钥匙串中，每个机密一项，标签为 `Echolot secret <name>`。它们属于工作区（通过 `workspace.toml` 中的 ID）以及定义该变量的层级。同一台 Mac 上的命令行工具读取同样的项。

在这台 Mac 上没有值的机密不会回退到其他层级。在你设置一个值之前，请求会显示 `the secret {{password}} has no value on this Mac`。

<Edition only="appstore">
  App Store 版使用同一个钥匙串。直接下载版或命令行工具创建的项可能会请求一次访问权限；请选择**始终允许**。
</Edition>

## 什么绝不会进入文件 [#what-never-goes-into-files]

Echolot 不会把下面这些写入工作区文件：

- 机密变量的值。
- [响应捕获](/docs/requests/captures)存储的机密：标记为机密的捕获只会写入钥匙串。在 Alpenglow 中，**Auth › Sign in** 把 `access_token` 捕获到机密 `{{token}}` 中。
- OAuth 2.0 令牌和 MCP 登录信息。
- 你用**移到钥匙串**（见下文）转移的值。

你以纯文本输入的内容仍是纯文本。当认证或代理的密码字段中是字面值而不是变量时，Echolot 会在它下方发出警告：**以纯文本形式存储在工作区文件中。** 点按**移到钥匙串**：该值会变成工作区的机密变量，字段中则换成 `{{name}}`。

在 Echolot 显示或交出已解析请求的任何地方，机密也会被遮盖：预览、快速查看、“变量”面板、历史记录搜索，以及智能体收到的一切内容。[生成代码…](/docs/workspaces/exporting#copy-a-request-as-code)和**拷贝为 cURL** 是例外：它们按请求将要发送的样子写出，机密也包含在内。

## 导入会把凭据移入机密 [#imports-move-credentials-into-secrets]

当你[导入](/docs/get-started/importing) Postman 集合、Insomnia 导出文件或其他文件时，在认证设置和凭据标头中找到的密码、令牌和 API 密钥会变成机密变量。它们的值进入钥匙串，请求中则换成 `{{name}}`：请求的名称加字段，例如 `{{me_password}}`。导入报告列出所存储机密的名称，绝不列出值。

写在地址（`https://user:pass@…`）、查询字符串和正文中的凭据目前不会被移动。导入之后请检查这些位置。

## 导出会略去值 [#exports-leave-values-out]

[导出](/docs/workspaces/exporting)在每种格式中都只写出机密变量的名称，不带值。打开导出内容的人在自己那边设置这些值。

## 命令行和 CI 中的机密 [#secrets-on-the-command-line-and-in-ci]

命令行工具按以下顺序查找机密的值：

1. 传给 `echolot run` 的 `--secrets` 文件：每行 `NAME=value`。
2. 环境变量 `ECHOLOT_SECRET_<NAME>`：名称大写，字母或数字以外的每个字符都变成 `_`。`{{token}}` 读取 `ECHOLOT_SECRET_TOKEN`；`{{api-key}}` 读取 `ECHOLOT_SECRET_API_KEY`。
3. 在 Mac 上，是 App 保存的钥匙串项。

```sh
ECHOLOT_SECRET_TOKEN=… echolot run Alpenglow.echolot --folder orders
echolot run Alpenglow.echolot --env staging --secrets staging.secrets
```

设置了 `CI`，或设置了 `ECHOLOT_KEYCHAIN=0` 时，会跳过钥匙串。在 CI 中，请从 CI 的机密存储设置 `ECHOLOT_SECRET_…` 变量。见 [CI](/docs/cli/ci)。

在环境变量中找到的机密对每个层级都有效：`ECHOLOT_SECRET_PASSWORD` 会在任何环境中应答 `{{password}}`。

命令行中的导入会像 App 一样把凭据移入机密。没有钥匙串时，工具会告诉你该设置哪些 `ECHOLOT_SECRET_…` 变量。

## 同事第一次打开 [#a-teammates-first-open]

克隆了工作区的同事会得到每个机密的名称，但没有任何值。他们的表格显示**未在这台 Mac 上设置**。他们设置一次自己的值，此后所有人都基于同样的文件、使用各自的凭据工作。见 [Git 和团队](/docs/workspaces/git-and-teams)。
