直接配github personal access token可解决,因github强制认证,未认证请求限60次/小时;需生成classic类型token(勾选repo和read:packages),执行composer config --global github-oauth.github.com 并设auth.json权限为600。

直接配一个 GitHub Personal Access Token 就能解决,不是网络问题、不是镜像源问题、也不是 Composer 版本问题——是 GitHub 强制要求身份认证,没 token 就卡在每小时 60 次的匿名限额里。
为什么 composer install/update 突然卡住并报 403 或 “rate limit exceeded”
Composer 在解析依赖时,只要遇到 github.com 上的包(尤其是 dev-master、dev-* 分支、私有 fork、或 source 指向 GitHub 的包),就会高频调用 https://api.github.com/ 查询 tag、commit、composer.json 等元数据。这些请求默认不带认证头,GitHub 按 IP 限流:每小时最多 60 次。公司出口、CI 服务器、多人共用环境极易撞墙。
- 错误典型提示:
Could not fetch https://api.github.com/repos/xxx/yyy/commits/master, please create a GitHub OAuth token - dist 包(zip 下载)走 Packagist CDN,不受此限;出问题的永远是 source 模式下的 API 元数据查询
- 即使你用 SSH 克隆代码,Composer 仍可能先走 HTTPS API 获取信息
怎么生成合法的 GitHub Token(必须是 classic 类型)
GitHub 已逐步停用 classic token,但 Composer 目前(2026 年中)仍**只兼容 classic 类型**;fine-grained token 会静默失败,别试。
- 访问
https://github.com/settings/tokens/new - 填写
Note(如composer-token-2026) - 过期时间建议选
30 days或自定义(classic token 默认永不过期,但定期轮换更安全) - 必须勾选:
repo(含public_repo和读私有库能力),read:packages(若用 GitHub Packages) - 不要勾选
delete_repo、admin:org等高危权限 - 点
Generate token后立刻复制——页面关闭即不可再查
怎么让 Composer 正确读到并使用这个 token
关键不是“有没有 token”,而是 Composer 能不能在每次 API 请求里带上 Authorization: Bearer xxx。这依赖三件事同时成立:
- 执行
composer config --global github-oauth.github.com <your_token></your_token>(注意 host 名必须是github.com,不是api.github.com) - 确认 token 写入位置:
~/.composer/auth.json(Linux/macOS)或%APPDATA%\Composer\auth.json(Windows) - 立刻执行
chmod 600 ~/.composer/auth.json(Windows 忽略此步,但需确保文件不被其他用户读取)——权限不是 600,Composer 会静默忽略该文件 - 验证是否生效:
composer config --global github-oauth.github.com应输出 token 前几位(Composer 自动掩码);composer diagnose输出里应有GitHub API: OK
配了还是报错?常见失效场景和排查点
多数“配了没用”不是 token 错,而是环境链路断了:
- 运行
composer install的用户 ≠ 执行composer config --global的用户(例如 CI 中用root配置,却以www-data运行命令) - 项目根目录下存在
auth.json,它会覆盖全局配置——删掉或确保内容一致 - PHP 禁用了
curl或 SSL 验证失败(旧版 CentOS 常见),导致 Authorization 头根本发不出去 - 公司代理/防火墙过滤了
Authorization请求头——可用curl -H "Authorization: token ghp_abc123" https://api.github.com/rate_limit单独验证 - CI 环境未在 job 开头显式运行
composer config --global,只靠提交的auth.json是无效的
token 本身不暴露在日志或命令行里,但硬编码进脚本、shell history、或明文提交到 Git,就等于把钥匙贴在门上。CI 中务必用 secret 环境变量 + COMPOSER_AUTH 注入,而不是写死。











