Composer报401主因是auth.json未被加载:路径错误(须在~/.composer/或项目根目录)、权限非600(Linux/macOS)、编码含BOM、域名不匹配,或凭据未用composer config命令写入。

Composer报401但Token明明填对了
不是Token错了,是auth.json根本没被加载——Composer遇到格式错误、权限不对或路径错位时会静默跳过,直到发请求才甩出401。它不提示“配置文件未读取”,也不报路径不存在。
-
composer config --global --list | grep github-oauth输出为空?说明凭据压根没写进去,别急着改文件,先用composer config --global github-oauth.github.com YOUR_TOKEN生成 - 手动编辑
auth.json必须严格匹配域名:GitHub 就是"github.com",不能写成"https://github.com"或"api.github.com" - Linux/macOS 下必须运行
chmod 600 ~/.composer/auth.json,否则 Composer 直接无视该文件(Windows 无此限制,但需确保%APPDATA%\Composer\目录可写) - 用
file -i ~/.composer/auth.json检查编码,必须是charset=utf-8;若显示utf-8-with-bom,用 VS Code 以 UTF-8 无 BOM 重存
GitHub Token必须重新生成的典型场景
Token 失效往往不是过期,而是权限或作用域变更导致的静默拒绝。以下情况必须新建 Token:
- 旧 Token 只有
public_repo权限,但你要访问私有仓库——必须勾选repo(含所有私有库读写) - 你启用了 GitHub 的 SSO(企业组织强制单点登录),旧 Token 会立即失效,页面提示 “Token is not authorized for SSO”
- 你在 GitHub 设置里点击了 “Revoke all tokens”,或某次安全审计后批量吊销了凭证
- Token 被硬编码在 CI/CD 配置中且已泄露(如误提交到公开仓库),必须立刻再生并轮换
HTTPS仓库URL必须带.git后缀
哪怕 Token 正确、auth.json 权限正确,repositories 里 URL 写错也会导致“找不到包”,而不是认证失败。
- 正确写法:
"url": "https://github.com/your-org/private-pkg.git"——末尾.git不可省略 - 错误写法:
"https://github.com/your-org/private-pkg"或"https://github.com/your-org/private-pkg/tree/main",Composer 解析时直接跳过整条源 - 如果用的是 GitLab 或自建 Gitea,同样要确保 URL 是裸仓库地址,不是 Web 页面地址
- 验证方式:
composer diagnose会明确报错 “Invalid repository” 并指出哪一行 URL 格式非法
代理环境下Token认证失败的隐藏链路
公司内网走 NTLM 代理或 HTTPS 代理配置不全时,Token 请求甚至发不出去——401 是假象,实际卡在 CONNECT 阶段。
- 只配了
http-proxy没配https-proxy?所有 GitHub 请求都会 fallback 直连,最终超时或返回 502,但 Composer 日志里只显示 “Could not authenticate” -
https-proxy值必须是http://开头,哪怕代理监听的是 HTTPS 端口,例如http://127.0.0.1:7890,填https://或漏协议头会静默失效 - NTLM 环境下,
curl -x http://127.0.0.1:3128 -I https://github.com若也返回 407,说明中转代理(如 cntlm)没配好,Composer 的 Token 根本没机会发送 - 临时绕过代理验证:
HTTP_PROXY= HTTPS_PROXY= composer install,如果此时成功,问题一定出在代理链路上


















