必须用composer config -g github-oauth.github.com 全局配置,否则写入项目级配置无效且易泄露;域名仅认github.com,需classic token并勾选repo权限,验证以composer diagnose显示github api rate limit为5000为准。

composer config -g github-oauth.github.com 是唯一生效路径
不加 -g 就等于白配——它会把 token 写进当前项目的 composer.json 的 config 字段,极易误提交到 Git,且对其他项目完全无效。GitHub API 元数据请求发生在依赖解析最开始阶段,此时项目级配置还没加载,只有全局配置能覆盖整个链路。
常见错误现象:composer install 仍卡在 fetch commit 或报 403 rate limit exceeded,但 composer config github-oauth.github.com 却返回空值——说明你漏了 -g。
-
github.com必须拼写准确,不能是api.github.com、www.github.com或带端口的变体 - Windows PowerShell 用户需避免
$符号被解析,建议用 CMD 或直接粘贴完整命令:composer config -g github-oauth.github.com ghp_xxx... - token 字符串前后不能有空格或不可见字符(比如复制时带入的换行),验证方式是运行
composer config -g github-oauth.github.com—— 应输出一串星号(如***),长度约 40 位
classic token + repo 权限是硬性要求
fine-grained token 在 Composer 中静默失效,哪怕权限勾得再全,也只会报 Could not authenticate 或 Could not fetch,不会提示“token 类型不支持”。必须去 GitHub 的 Settings → Developer settings → Personal access tokens → Tokens (classic) 创建。
权限只勾两个就够:repo(读写私有库、fork、public repo 元数据)和 read:packages(仅当你用 GitHub Packages 时需要)。其他权限如 delete:packages 或 admin:org 完全没必要,Composer 从不执行这些操作。
- 如果组织启用了 SSO,即使 token 正确,也得手动去 Settings → Applications → Authorized OAuth Apps 页面 approve
- token 过期时间建议设为 30 天,方便定期轮换;生成后立刻复制,页面关闭就再也看不到原始值
- CI 环境(如 GitHub Actions)不能直接用
composer config -g写死 token,应通过COMPOSER_AUTH环境变量注入 JSON 字符串
验证是否真走认证通道,别只看有没有报错
很多用户执行完命令就以为搞定了,结果 composer install 还是慢或失败。真正要确认的是 Composer 是否在发请求时用了 token。
- 运行
composer diagnose,末尾应显示GitHub API: OK,且rate limit显示为5000;若仍是60,说明 token 没生效 - Linux/macOS 上检查
~/.composer/auth.json权限:必须是600(chmod 600 ~/.composer/auth.json),否则 Composer 拒绝读取 - 临时删掉 token,再跑
composer show monolog/monolog -vvv 2>&1 | grep 'api.github.com',能看到大量403响应;加回 token 后应返回200
局部配置只适合隔离场景,且风险更高
进项目目录执行 composer config github-oauth.github.com your_token 会把 token 写入项目根目录下的 auth.json。这不是推荐做法,除非你明确需要为单个项目指定不同 token(比如测试私有仓库权限)。
- 务必把
auth.json加入.gitignore,否则等于把 token 暴露在公开仓库中 - 局部配置优先级高于全局,一旦项目
composer.json中有"config": { "github-oauth": { ... } },全局 token 就会被完全忽略 - 团队协作中,局部配置极易引发环境不一致问题;CI 构建时若未清理
auth.json,可能因权限不足导致构建失败
http-basic 认证、或者项目 composer.json 里定义了 repositories 字段覆盖了默认行为。这些都会让 GitHub 认证静默失效,错误日志里却只显示模糊的 “Could not fetch”。











