Composer install 报“API rate limit exceeded”是因为未认证访问 GitHub API 导致每小时 60 次请求上限被触发;解决方法是生成 GitHub Personal Access Token(勾选 repo 和 read:packages 权限),并通过 composer config -g github-oauth.github.com <token> 安全配置到全局 auth.json。

为什么 composer install 突然报 “API rate limit exceeded”?
因为 Composer 默认用未认证方式访问 GitHub API,每小时最多 60 次请求。一旦项目依赖较多、含私有仓库或频繁重装,很容易触发限流,错误信息是:Could not fetch https://api.github.com/...: Failed to decode response: JSON decode error: Syntax error 或更直白的 API rate limit exceeded for xxx.xxx.xxx.xxx。这不是网络问题,也不是 Composer 坏了,是 GitHub 在拒绝你——没带“工牌”就进厂区。
如何生成并配置 GitHub Personal Access Token
Token 就是你的 GitHub “工牌”,得自己去后台领,不能复用密码或随便抄一个网上示例。
- 登录 GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic)
- 点 Generate new token → Generate new token (classic)
- 勾选
repo(读私有库必需)、read:packages(如果用了 GitHub Packages)、delete:packages(可选)——不要勾选admin:org或user这类高危权限 - 生成后立即复制保存——页面刷新后就再也看不到明文了
怎样让 Composer 安全地使用这个 Token
别把 Token 写死在 composer.json 里,也别塞进命令行参数(会留 shell 历史)。正确做法是写入全局 auth 配置:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
composer config -g github-oauth.github.com <your_token_here>
执行后,Composer 会在 ~/.composer/auth.json(Windows 是 %APPDATA%\Composer\auth.json)里存一条加密记录。验证是否生效:运行 composer config -g --list | grep github-oauth,应看到非空输出。
- 如果项目需访问 GitHub 私有仓库,还需确保
composer.json中的repositories类型为vcs或github,且 URL 是 HTTPS 格式(如https://github.com/your-org/private-package),不是 Git 协议 - CI 环境(如 GitHub Actions)应通过
secrets.GITHUB_TOKEN注入,并用composer config github-oauth.github.com "${{ secrets.GITHUB_TOKEN }}"动态配置,避免硬编码 - 旧版 Composer(github-oauth 自动注入,必须升级到 Composer 2.x
Token 失效或权限不足时的典型表现
不是所有 “404” 或 “403” 都是网络问题。遇到这些现象,优先怀疑 Token:
-
Could not find package vendor/name at any version—— 实际是 Token 权限不够读私有 repo,Composer 假装包不存在 -
Failed to download vendor/name: Invalid credentials for https://api.github.com/...—— Token 过期、被删,或没勾repo - 本地能装,CI 报错 —— CI 没配 Token,或用了过期的缓存镜像
Token 本身没有“自动续期”机制,过期就得重生成;也不支持细粒度仓库级授权,只要它能读的 repo,Composer 全部默认可用——这点容易被忽略,但恰恰是安全边界所在。

















