第22章 环境变量、密钥与 API Key 管理
AI 应用通常依赖外部服务,而这些服务往往需要 API key。
例如:
API_KEY
DATABASE_URL
MODEL_ENDPOINT
这些值可能非常敏感。
切勿将它们当作普通源代码处理。
危险的做法
不要这样做:
API_KEY = "123456789-secret"
如果仓库是公开的,凭证就已经泄露了。即使之后删掉这行代码,密钥仍可能残留在仓库历史或其他副本中。
环境变量
更好的做法是:
import os
api_key = os.getenv("API_KEY")
代码从环境中读取值,密钥本身不会保存在源文件里。
.env 文件
本地开发时,可以使用 .env 文件。
例如:
API_KEY=your-secret-key
然后用 python-dotenv 之类的包来加载它。
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv("API_KEY")
切勿提交 .env
将它加入 .gitignore。
.env
这样可以防止 Git 追踪本地的密钥文件。
环境变量与密钥
这两个概念关系密切。
环境变量是提供给应用的配置值;密钥则是必须加以保护的敏感配置值。
举例:
PORT=7860
属于配置。
API_KEY=...
属于敏感信息。
校验必需的密钥
如果应用缺少某个密钥就无法运行,就应当校验它的存在。
api_key = os.getenv("API_KEY")
if not api_key:
raise RuntimeError(
"API_KEY is not configured."
)
这样能在启动时给出明确的错误提示,避免后续出现难以排查的故障。
不要打印密钥
要避免:
print(api_key)
尤其是在日志中。
日志可能被存储或泄露。
密钥轮换
如果不小心发布了密钥,光删除代码是不够的。
你应该立即吊销或轮换该凭证。
要假定已发布的密钥已经泄露。
部署环境中的密钥
托管平台通常都提供安全的配置机制。
对于 Hugging Face Spaces,应使用平台自带的密钥管理功能来配置敏感信息,而不是直接提交到代码仓库。
多环境配置
本地环境和生产环境可以使用不同的凭证。
例如:
Development API key
Production API key
这种分离很有用,可以避免开发测试意外消耗生产环境的资源。
不要把密钥写进前端代码
如果你开发的是浏览器端应用,交付给浏览器的任何内容都应视为对用户可见。
API 密钥不应内嵌在客户端 JavaScript 中,敏感凭证应保存在服务端。
动手试一试
创建一个简单的 Gradio 应用,从环境变量中读取:
MY_APP_NAME
然后再添加一个变量:
API_KEY
但不要显示它的值,而是显示:
API key configured: Yes
或者:
API key configured: No
这样可以在不暴露凭证的前提下练习密钥处理。
要点总结
绝不把 API 密钥硬编码到源代码中。
用环境变量管理配置。
本地开发可适当使用
.env文件,但绝不能提交到仓库。生产环境的密钥使用托管平台的密钥管理工具存储。
不要打印密钥。
凭证一旦意外泄露,立即轮换。
切勿认为客户端代码可以安全地存放机密凭据。