多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

如何用 Bun secrets API 安全存储和读取敏感凭据

如何用 Bun secrets API 安全存储和读取敏感凭据 如何用 Bun secrets API 安全存储和读取敏感凭据【免费下载链接】bunIncredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one项目地址: https://gitcode.com/GitHub_Trending/bu/bunBun 的Bun.secretsAPI 让你把 token、密码、API key 这类敏感凭据写进操作系统的原生凭据存储macOS Keychain、Linux libsecret、Windows Credential Manager而不是留在~/.npmrc、~/.aws/credentials、.env这类明文文件里。这篇文档面向用 Bun 写 CLI 工具或本地应用的开发者你会学会如何存储、读取、更新和删除一条凭据并验证它确实落在了系统安全存储里。注意官方文档 明确标注该 API 是 new and experimental未来可能变化。平台前提不同操作系统依赖不同的系统服务运行前确认对应服务可用macOS凭据存入用户的 login keychain首次使用时 Keychain 可能弹出访问授权提示凭据在系统重启后依然保留且只能被存储它的用户访问。Linux需要运行中的 secret service daemon如 GNOME Keyring、KWallet 或其他 secret service凭据存入 default collectionkeyring 处于锁定状态时可能提示解锁。Windows凭据存入 Windows Credential Manager以CRED_PERSIST_ENTERPRISE标志持久化按用户隔离使用 Windows Data Protection API 加密可以在「控制面板 → Credential Manager → Windows Credentials」中查看。所有操作都是异步、非阻塞的运行在 Bun 的 threadpool 上。存储一条凭据用secrets.set()存储凭据参数对象需要service、name、value三个字符串字段。service是服务或应用名name是用户名或账户标识两者共同唯一定位一条凭据import { secrets } from bun; await secrets.set({ service: my-cli-tool, name: github-token, value: ghp_xxxxxxxxxxxxxxxxxxxx, // 替换为你的真实 token });如果同一service/name组合已经存在凭据Bun 会直接替换旧值所以同一段代码可以用作“存储”也可以用作“更新”。官方类型定义还提到两种特殊用法见 bun.d.tsvalue传空字符串等价于delete()macOS 上可传allowUnrestrictedAccess: true允许其他应用免交互访问该 keychain 项文档说明这对 CI 环境有用但会降低安全性其他平台忽略该参数。文档给出的 service 命名建议用能对应实际工具的名称对外发布的 CLI 可以用 UTI反向域名风格避免api、key这类过于泛化的名字// Good - matches the actual tool { service: com.docker.hub, name: username } { service: com.vercel.cli, name: team-name } // Avoid - too generic { service: api, name: key }读取凭据secrets.get()返回Promisestring | null找到凭据时返回字符串不存在时返回null。典型用法是先读读不到再提示用户输入并回存这是文档主示例的完整模式import { secrets } from bun; let githubToken: string | null await secrets.get({ service: my-cli-tool, name: github-token, }); if (!githubToken) { githubToken prompt(Please enter your GitHub token); await secrets.set({ service: my-cli-tool, name: github-token, value: githubToken, }); console.log(GitHub token stored); } const response await fetch(https://api.github.com/user, { headers: { Authorization: token ${githubToken} }, }); console.log(Logged in as ${(await response.json()).login});除对象形式外也支持位置参数await secrets.get(my-cli-tool, github-token)。读取成功且凭据有效时response.json()的login字段会返回 GitHub 用户名这是判断整条链路跑通的直接依据。更新与删除更新不需要单独的方法对同一个service/name再次set即可覆盖旧值官方示例展示了把email-server下adminexample.com的密码从old-password更新为new-password的过程。删除用secrets.delete()返回Promisebooleantrue表示确实删掉了一条凭据false表示未找到对应凭据。这个返回值本身就是验证方式const deleted await Bun.secrets.delete({ service: my-app, name: aliceexample.com, }); // Returns: boolean文档同时给出错误处理的写法对set包一层try/catch捕获失败用get后判断 null来确认某条凭据不存在。验证凭据已正确存放按平台做如下检查通过 API 回读get返回你存入的字符串说明可读回返回null说明该service/name组合下没有凭据可能是 keyring 锁定或从未存入。通过系统界面确认Windows 上打开「控制面板 → Credential Manager → Windows Credentials」可以看到该条目macOS 上首次访问会触发 Keychain 的授权提示Linux 上则确认 secret service daemon 在运行。删除后复验delete返回true后再次get应得到null。从明文配置迁移文档给出的迁移模式是把原本写在~/.aws/credentials、.env里的值改为从 secrets 读取并保留环境变量作为 CI/生产环境的回退// Instead of storing in ~/.aws/credentials await Bun.secrets.set({ service: aws-cli, name: AWS_SECRET_ACCESS_KEY, value: process.env.AWS_SECRET_ACCESS_KEY, }); // Load at runtime const apiKey (await Bun.secrets.get({ service: my-app, name: api-key, })) || process.env.API_KEY; // Fallback for CI/production限制与适用边界文档明确列出的限制直接照做即可密码最大长度随平台不同typically 2048-4096 bytesservice和name建议保持在 256 字符以内部分特殊字符可能需要按平台转义依赖系统服务Linux 的 secret service daemon、macOS 的 Keychain Access、Windows 的 Credential Manager 必须可用。与生产环境的边界文档的 “Comparison with Environment Variables” 和 “Best Practices” 两节都指出这个 API 主要用于本地开发工具CLI、本地开发服务器、个人测试用 API key对部署/生产环境的 secret 并不适合——生产环境应使用环境变量或专门的 secret 管理方案。此外它被标注为“slow”只适合存凭据本身非敏感配置仍应放在配置文件里Bun 会在不再需要后把密码内存清零值由操作系统加密、不落明文。完整的 API 签名见 docs/runtime/secrets.mdx类型声明见 packages/bun-types/bun.d.ts。【免费下载链接】bunIncredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one项目地址: https://gitcode.com/GitHub_Trending/bu/bun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表