最近我在把 OpenClaw 这个开源 AI 应用平台和 MiniMax 的大模型接口连起来用的时候,本地测试一切正常,但只要一部署到服务器上——不管是云主机还是 Docker 容器——每次调用 MiniMax 接口都会返回 HTTP 401 Unauthorized 错误,后来我反复检查、不断尝试,终于搞清楚了问题出在哪儿,下面就把整个过程和解决办法写出来,希望能帮到有同样困扰的朋友。
先说说项目是啥情况
OpenClaw 是一个能快速接入各种大语言模型的工具,而 MiniMax 是国内一个挺常用的模型服务商,提供聊天、文本生成这些功能。我在自己电脑上跑代码完全没问题,可一旦放到线上环境,请求就总是被拒绝,状态码就是那个熟悉的 401。
一开始以为是认证没配好
401 错误通常说明服务器觉得你没权限,也就是身份验证没通过。MiniMax 要求每个请求头里必须带上一行像这样的内容:
Authorization: Bearer <你的API密钥>所以我先去确认代码是不是真的读到了密钥。我检查了 .env 文件,里面确实写了 MINIMAX_API_KEY,而且程序也能把它读出来,因为本地能跑通,所以基本可以确定代码逻辑本身是对的。
第一个怀疑:环境变量没生效?
很多人在部署时会遇到环境变量没加载的问题,比如用 Docker 启动容器的时候忘了挂载 .env 文件,或者没用 -e 参数传进去,程序自然就读不到密钥。
为了解决这个可能,我确保启动命令里加了 --env-file .env,也试过直接用 -e MINIMAX_API_KEY=xxx 的方式传值。另外,如果是用 systemd 或其他方式启服务,也要注意它不一定能自动读到你 shell 里的变量。
不过这次不是这个问题,因为我特意在日志里打印了密钥的前几个字母,发现它确实被成功读进来了。
真正的问题藏在看不见的地方
接着我仔细看了发请求的那段代码,用的是 Python 的 requests 库,写法很普通:
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}看起来没啥毛病。但 MiniMax 的文档特别强调:API 密钥必须是一个干净的字符串,不能带空格、换行或者别的奇怪符号。
我就想到,会不会是 .env 文件里密钥后面悄悄多了一个换行?这种情况在 Windows 上编辑完文件再传到 Linux 服务器时特别常见。
为了验证,我在代码里加了一行 print(repr(api_key)),结果输出是 'xxxxxxxxxxxxxx\n' —— 果然,末尾多了一个 \n!
这样一来,实际发出去的认证头就变成了 Bearer xxxxxxxxxxxx 后面跟着一个看不见的换行,MiniMax 服务器当然认不出来,直接返回 401。
找到根子,就好办了
问题其实很简单:.env 文件保存时,很多编辑器(比如 VS Code 或记事本)会自动在最后一行加一个换行符。这在普通文本里不算错,但放在密钥这种地方就会导致认证失败。
我是这么解决的:
在代码里把密钥“擦干净”:读取环境变量之后,用
.strip()把前后多余的空白字符去掉:api_key = os.getenv("MINIMAX_API_KEY", "").strip()这样不管有没有空格或换行,都能处理掉。
- 写
.env文件时小心点:确保密钥那一行后面没有多余内容。如果不确定,可以用cat -A .env命令看看有没有隐藏符号。 - 启动时加个简单检查:程序刚运行的时候,可以打一条日志,比如 “API Key loaded, length: 32”,这样既能确认密钥加载了,又不会把完整密钥暴露出来。
再给几点小建议
- 千万别在日志里打印完整的 API 密钥,容易泄露。
- 正式上线时,最好别把密钥直接写在
.env文件里,改用更安全的方式,比如 Kubernetes 的 Secrets 或 HashiCorp Vault 这类专门管密钥的工具。 在写代码之前,可以用
curl手动试一下接口,看密钥是不是真的有效,比如:curl -H "Authorization: Bearer YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"abab5.5-chat", "messages":[{"role":"user","content":"hello"}]}' \ https://api.minimax.chat/v1/text/chatcompletion
最后说两句
别看 401 错误好像很简单,有时候真正的原因特别隐蔽,比如这次就是一个看不见的换行符惹的祸。这也提醒我,处理账号、密码、密钥这些东西的时候,一定要格外仔细。希望我的经历能让你少走点弯路!
下次再碰到类似问题,不妨先问问自己:我的密钥真的干干净净、一个多余字符都没有吗?