Composer 拉取 GitHub 仓库失败主因是未配置或配置错误的 GITHUB_TOKEN:GitHub 自2021年起强制要求 API 认证,未认证请求受60次/小时限速,触发403错误;需用 composer config -g github-oauth.github.com 正确写入含 repo 权限的 Token,并确保域名精确匹配、无项目级配置覆盖。

Composer 拉取 GitHub 仓库失败,大概率是没配 GITHUB_TOKEN,或者配了但权限/作用域不对。
为什么 Composer 会突然拉不动 GitHub 的包?
GitHub 自 2021 年起强制要求对私有 API 请求(包括 composer install 时的元数据查询和 ZIP 下载)必须带认证。即使你拉的是公开仓库,Composer 默认也走 GitHub API 获取 composer.json 和版本列表——一旦触发速率限制(未登录用户限速 60 次/小时),就会报错:Could not fetch https://api.github.com/... 403 或 API rate limit exceeded。
常见错误现象:
Failed to download vendor/package: Could not authenticate against github.comfile_get_contents(https://api.github.com/...): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden- 命令卡在
Reading composer.json of vendor/package (dev-main)后长时间无响应
怎么配 GITHUB_TOKEN 才真正生效?
Token 必须满足两个条件:存在 + 有正确 scope。只在 auth.json 里写 token 不够,还要确保它被 Composer 正确读取并用于 GitHub 域名。
- 生成 Token:去 https://www.php.cn/link/9c450eb90c31bc12f1691f235da5a0cc,勾选
repo(必需)和read:packages(如果用 GitHub Packages) - 写入全局认证文件:
composer config -g github-oauth.github.com <your_token_here> - 别手写
auth.json:手动编辑容易格式出错;优先用composer config命令写入,它会自动处理转义和路径 - 验证是否生效:
composer config -g --list | grep github应该输出github-oauth.github.com对应的值
为什么配了 token 还报 401?检查这三点
Token 本身没问题,但 Composer 可能根本没用上它。
- 域名写错了:
github.com不能写成www.github.com或api.github.com—— Composer 只认github.com这个 key - 项目级配置覆盖了全局:
composer.json同目录下有auth.json,且里面写了空的或错误的github-oauth,会优先生效 - 用了企业版 GitHub(GHES):
github.com的 token 对github.company.internal无效,得单独配:composer config -g github-oauth.github.company.internal <token>
不希望全局配 token?临时方案更可控
某些 CI 环境或共享机器上,全局配置不合适。可用环境变量临时注入,且优先级高于 auth.json:
- 运行前导出:
GITHUB_TOKEN=xxx composer install - 或在 CI 脚本中写:
export GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}(GitHub Actions) - 注意:这个变量只对当前命令生效,不会污染其他操作;但必须确保 Composer 版本 ≥ 2.2(旧版不识别该变量)
Token 的有效期、scope 和作用域匹配比想象中更敏感——少一个 repo 权限,或域名拼错一个字符,都会静默降级回未认证请求,然后在某个随机包上突然失败。别猜,用 composer config -g --list 和抓包看实际请求头最可靠。










