Composer 触发 GitHub 速率限制是因为未认证请求走匿名 API 通道(每小时限 60 次),大量拉取包时易超限;需用带 repo 权限的 Personal Access Token 配置 composer config -g github-oauth.github.com 。

为什么 Composer 会触发 GitHub 的速率限制?
未认证的 Composer 请求默认走 GitHub 的匿名 API 限流通道,每小时最多 60 次请求。一旦 composer install 或 composer update 需要从 GitHub 拉取大量包(比如私有仓库、带 Git Submodule 的依赖、或频繁访问 Packagist 镜像未缓存的元数据),就会收到 403 rate limit exceeded 错误。
如何生成 Personal Access Token 并配置给 Composer?
GitHub 已弃用密码登录 API,必须使用 Personal Access Token(PAT),且需勾选 repo 权限(读取私有仓库)和/或 public_repo(读取公开仓库)。Composer 不支持 OAuth App Token 或 Fine-grained Token(后者在 2024 年后对 Git 操作兼容性不稳定)。
- 访问 https://www.php.cn/link/9c450eb90c31bc12f1691f235da5a0cc
- Token description 填写如
composer-github-auth - 勾选
repo(必需),可选delete_repo(仅当你用 Composer 删除仓库时才需要) - 生成后立即复制该 token —— 页面关闭后无法再次查看明文
- 运行命令写入全局配置:
composer config -g github-oauth.github.com
注意:github.com 是域名,不是用户名;token 必须粘贴完整,不能有多余空格或换行。
验证是否生效及常见失败原因
执行 composer diagnose,若看到 GitHub API: OK 表示认证已通过。但以下情况仍会失败:
- token 权限不足:未勾选
repo→ 报错401 Unauthorized - token 过期或被手动删除:GitHub 不主动过期 PAT,但用户可能误删 → 报错
401 Bad credentials - Composer 使用了错误的域:例如配置成
github.com:xxx或api.github.com→ 实际只认github.com作为 host key - 项目级配置覆盖了全局配置:检查项目根目录下的
auth.json是否存在冲突项
临时调试可用:
COMPOSER_AUTH='{"github-oauth":{"github.com":"xxx..."}}' composer update 绕过配置文件直接注入。
敏感信息安全与 CI 环境适配
本地开发可放心用全局配置,但 CI 环境(如 GitHub Actions、GitLab CI)绝不能硬编码 token。应使用环境变量注入:
- GitHub Actions 中:把 token 存为
secrets.GITHUB_TOKEN,并在 step 中用composer config github-oauth.github.com ${{ secrets.GITHUB_TOKEN }} - 避免在
auth.json中提交 token:该文件默认被.gitignore排除,但若误提交,GitHub 会自动废止该 token 并发邮件警告 - 如需多账号协作(如公司账号 + 个人账号),不要共用一个 token;Composer 支持 per-repository auth,但更推荐统一用组织级 token + SSO 授权
真正容易被忽略的是:GitHub 的 token 作用域是账户级的,一旦泄露,等同于交出整个账号的代码读写权限 —— 所以宁可多建几个最小权限 token,也不要复用一个“全能” token。











