这个坑值得记一笔。在 Java 服务里用 REST 调 Azure 上的 gpt-4o,资源在 East US,请求地址是 https://myaoai.openai.azure.com/openai/deployments/chat/chat/completions?api-version=2024-06-01,返回 401,原文 Access denied due to invalid subscription key or wrong API endpoint,同一个 key 在同事的 Python 脚本里能通。

刚开始盯着「api-version 用了该区域尚未开放的预览日期」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。请求头里用的是 api-key 还是 Authorization Bearer 没对上;资源名写成了显示名 endpoint 域名拼错一位;key 属于另一个订阅 资源组迁移后配置没更新。

动手时先在门户里核对资源和真实 endpoint

az cognitiveservices account show --name myaoai --resource-group rg-ai --query properties.endpoint

随后用 curl 带 api-key 头打同一个部署

curl -i 'https://myaoai.openai.azure.com/openai/deployments/chat/chat/completions?api-version=2024-06-01' -H "api-key: $AZURE_KEY" -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"hi"}]}'

接着列出资源下的部署名 确认路径里的 chat 存在

az cognitiveservices account deployment list --name myaoai --resource-group rg-ai -o table

剩下的就是把 endpoint 和 api-version 收进配置后重启服务

python -c "import os;print(os.getenv('AZURE_OPENAI_ENDPOINT'))"

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

这台环境是别人交接的,不少默认值被动过,只能一项项核。

别只看报错消失,验证要多做一步。同一个 key 返回 200,响应体里 model 字段是 gpt-4o,服务日志中的 endpoint 与门户一致。

Azure 的鉴权头和 OpenAI 官方完全不同,api-key 与 Bearer 混用会直接 401,先看请求头再看 key。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189