配GitHub Token仍报403或429的根本原因是Composer未实际使用该Token,常见失效点包括:auth.json权限非600、配置用户与运行用户不一致、项目级auth.json覆盖全局配置。

为什么配了 GitHub Token 还报 403 或 429
不是 token 本身无效,而是 Composer 根本没用上它。常见失效点有三个:auth.json 权限不对、配置用户与运行用户不一致、项目级 auth.json 覆盖了全局配置。
Linux/macOS 下必须执行:chmod 600 ~/.composer/auth.json;权限是 644 或 755,Composer 就会静默忽略该文件,退回到未认证状态。
检查实际生效位置:composer config --list(不加 --global)会显示当前项目读取的配置源;如果输出里有 github-oauth.github.com 但值为空,说明被本地 auth.json 覆盖或格式错误。
- CI 环境中用
sudo配置 token,但构建跑在www-data或runner用户下 → token 对构建用户不可见 - 项目根目录存在
auth.json,且内容为空或 JSON 格式错误(比如多逗号、少引号)→ Composer 读取失败后不报错,直接 fallback 到匿名请求 - PowerShell 中粘贴含
$的 token 未加单引号 → shell 展开变量导致 token 截断
GitHub Token 和 Packagist Token 混用会失效
两者用途不同,key 名也不同,混用会导致认证完全不生效:
github-oauth.github.com 用于 GitHub API(查 tag、commit、zipball);github-oauth.packagist 才用于 Packagist.org 的元数据接口(如 /packages.json)。写反了,对应请求仍走匿名通道。
验证方式:运行 composer diagnose,看输出中 GitHub API 和 Packagist API 是否都标为 OK。只有一项 OK,说明另一方的 token 没配对。
- GitHub Token 必须勾选
repo(public_repo对纯公开项目够用),不能用 fine-grained 类型 - Packagist Token 只需登录 https://www.php.cn/link/10fa97233fb64af4b6ce8316d0bc2eca → “API Token” → “Create New Token”,生成后仅显示一次
- Windows 用户注意:PowerShell 默认不识别双引号包裹的 token,建议用
composer config -g github-oauth.github.com '$TOKEN'
镜像源不能绕过 GitHub API 限流
国内镜像(阿里云、清华)只缓存 Packagist 元数据,不代理 GitHub API 请求。哪怕你把 packagist.org 换成镜像源,只要依赖里有 "type": "vcs" 或 "repository": {"url": "https://github.com/..."},Composer 仍会直连 api.github.com 查 tag 和 commit —— 这部分请求永远绕不开认证。
典型触发场景:composer require vendor/package:dev-main、私有 fork 的包未改 dist 地址、composer update 时解析大量 dev 分支。
- dist 包下载走的是 Packagist CDN,不受限;出问题的永远是 source 模式下的元数据查询
- 公司/学校共享出口 IP,60 次限额是按 IP 统计,多人共用极易撞墙
- 别试
composer clear-cache或重试——未带 token 的请求,重试只会更快耗尽额度
CI 环境必须动态注入 token
GitHub Actions、GitLab CI 等环境不能硬编码 token,也不能依赖本地 ~/.composer/auth.json(每次 job 都是干净容器)。必须通过 secrets 注入,并在 job 步骤中动态配置。
GitHub Actions 示例:
composer config github-oauth.github.com "${{ secrets.GITHUB_TOKEN }}"
注意:secrets.GITHUB_TOKEN 是 Actions 自动提供的短期 token,自带 repo 权限,无需手动创建;但只对当前仓库有效,跨组织私有库需另配 classic token。
- GitLab CI 中用
CI_JOB_TOKEN或自定义 secret,命令同上 - 自建 Jenkins 或 Docker 容器中,确保
COMPOSER_HOME指向可写路径,否则composer config写不进auth.json - token 注入后立即验证:
composer config --list | grep github-oauth应输出非空值


















