Token 是有效的,但我的无头代理(Headless Agent)还是报了 401 错误。

我编写了两个通过代码调用 Claude 的小工具。一个用于生成 commit message,另一个用于更新个人资料。

代码看起来很完美。它从环境变量中获取 API key,向 Anthropic API 发送原始 HTTPS 请求,并解析 JSON 响应。

但每次都会以 401 错误失败。

问题不在代码,而是在身份验证方式上。

我并没有使用原始的 API key。我是通过订阅使用 Claude Code 的,这通过 Claude CLI 使用 OAuth 进行身份验证。这与我的脚本所预期的系统完全不同。

我的环境变量中 API key 变量的值是陈旧的或空的。脚本检测到了一个值,并认为它是有效的。结果请求发出的凭据类型是错误的。

解决方法很简单。我停止了直接进行 API 调用。相反,我让脚本使用已经拥有有效会话(session)的 CLI。

旧方法: 使用 urllib 通过 API key 发送请求。

新方法: 使用 subprocess 直接运行 "claude" 命令。

CLI 会为你处理会话、token 以及过期问题。

这种错误在无头环境(headless environments)中非常危险。人类可以在终端看到错误,但 cron job 或 CI 流水线会静默失败。你可能几天都不会察觉。

你在其他地方也会看到同样的模式:

  • 工具在寻找 personal access token,但系统使用的是 OIDC。
  • 脚本在读取 AWS keys,而系统使用的是 IAM role。

Token 存在,格式正确,通过了基础检查,但使用的机制不对。

遵循以下规则以避免此类问题:

  • 在编写代码之前,先通过交互方式询问你的环境是如何进行身份验证的。不要仅仅依赖 API 文档。
  • 不要盲目信任 os.environ。存在的值可能是陈旧的或错误的。
  • 如果一个 CLI 工具可以为你处理身份验证,那就使用它。通过调用 CLI(shell out)来操作,而不是自己重新构建身份验证逻辑。
  • 如果遇到 401 错误,在修改请求代码之前,先检查你的凭据路径。

Source: https://dev.to/enjoy_kumawat/the-token-was-valid-my-headless-agent-401d-anyway-3bgl

Optional learning community: https://t.me/GyaanSetuAi