答案是GitHub API未认证导致每小时60次请求限流,需配置classic类型且勾选repo权限的Token至全局auth.json并设chmod 600权限,再通过composer diagnose验证GitHub API: OK。

为什么 composer install 会卡在 “Resolving packages” 或报 403
不是网络慢,也不是包不存在,是 GitHub API 拒绝了未认证请求。Composer 在解析 dev- 分支、私有仓库 tag 列表、或依赖含 fork 的包时,会高频调用 https://api.github.com/。没配 Token 时,每小时仅限 60 次匿名请求——公司共用出口 IP、CI 多次重试、甚至装一个带 5 个 dev 依赖的包,都可能直接耗尽额度。错误表现包括:Could not fetch https://api.github.com/、API rate limit exceeded、交互式提示 Token input required。
必须用 --global 配 github-oauth.github.com
项目级配置(即不加 --global)会把 Token 写进当前项目的 auth.json,极易误提交到 Git,且多数场景下根本不会生效。全局配置才真正起作用,路径为:~/.composer/auth.json(Linux/macOS)或 %APPDATA%\Composer\auth.json(Windows)。操作只需两步:
- 去
https://github.com/settings/tokens/new创建 classic token,勾选repo(不是public_repo,私有库和 fork 元数据读取必须这个权限) - 终端执行:
composer config --global github-oauth.github.com ghp_xxx...(复制时注意别带空格或换行)
配完立刻检查权限:chmod 600 ~/.composer/auth.json。权限不是 600,Composer 会静默忽略该文件,退回到未认证状态。
验证是否真生效,别信“配了就行”
运行 composer diagnose,看到 GitHub API: OK 才算通了。如果还报错,优先排查这几个点:
- 执行
composer config --global github-oauth.github.com和运行composer install的用户不一致(比如用sudo装包,但 config 是普通用户配的) - 项目根目录下存在
auth.json,它会覆盖全局配置;可用composer config --list查看实际生效位置 - Token 已被 GitHub 删除或过期(classic token 默认永不过期,但 fine-grained token 有明确有效期)
- PHP 禁用了
curl或 SSL 验证失败(某些旧版 CentOS 会出现,导致Authorization头根本发不出去)
私有仓库 URL 必须用 HTTPS 格式
哪怕你习惯用 SSH,也得在 composer.json 的 repositories 里写成 HTTPS 地址,并设 "type": "vcs"。例如:
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/your-org/private-package.git"
}
],
"require": {
"your-org/private-package": "dev-main"
}
}
用 git@github.com: 格式?那必须额外配 SSH 密钥,且 Composer 不会自动 fallback 到 Token 认证——一旦 SSH 失败,就彻底卡住。HTTPS + Token 是最稳的组合,也是 GitHub 官方推荐路径。


















