解决部署OpenClaw + MiniMax时,出现的HTTP 401错误

· 编程技术杂谈

最近我在把 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 或记事本)会自动在最后一行加一个换行符。这在普通文本里不算错,但放在密钥这种地方就会导致认证失败。

我是这么解决的

  1. 在代码里把密钥“擦干净”:读取环境变量之后,用 .strip() 把前后多余的空白字符去掉:

    api_key = os.getenv("MINIMAX_API_KEY", "").strip()

    这样不管有没有空格或换行,都能处理掉。

  2. .env 文件时小心点:确保密钥那一行后面没有多余内容。如果不确定,可以用 cat -A .env 命令看看有没有隐藏符号。
  3. 启动时加个简单检查:程序刚运行的时候,可以打一条日志,比如 “API Key loaded, length: 32”,这样既能确认密钥加载了,又不会把完整密钥暴露出来。

再给几点小建议

最后说两句

别看 401 错误好像很简单,有时候真正的原因特别隐蔽,比如这次就是一个看不见的换行符惹的祸。这也提醒我,处理账号、密码、密钥这些东西的时候,一定要格外仔细。希望我的经历能让你少走点弯路!

下次再碰到类似问题,不妨先问问自己:我的密钥真的干干净净、一个多余字符都没有吗?