composer必须配github token才能稳定拉取依赖,因2026年github api强制认证;需用composer config -g github-oauth.github.com ghp_xxx写入classic类型token(权限含repo),ci场景则必须用合法json格式的composer_auth环境变量。

Composer 必须配 GitHub Token 才能稳定拉取依赖,这不是可选项,是当前(2026 年)GitHub API 的强制要求。没配或配错,composer install 和 composer update 会卡在 Reading composer.json 或直接报 Could not authenticate against github.com、API rate limit exceeded —— 这不是网络问题,是认证根本没走通。
github-oauth.github.com 必须用 composer config -g 写入
这条命令是唯一推荐的写入方式,手写 ~/.composer/auth.json 极易出错(比如漏逗号、引号不闭合),导致 Composer 静默跳过所有认证。
-
composer config -g github-oauth.github.com ghp_xxx——-g不可省略,否则写进当前项目composer.json,可能误提交到 Git - 域名必须是
github.com,填api.github.com、www.github.com或github.com:443全都不认 - Windows PowerShell 用户注意:
$符号需转义,建议改用 CMD 或直接粘贴 token 字符串 - 验证是否生效:
composer config -g github-oauth.github.com应输出***(长度合理,通常 40 位),空输出或报错说明写入失败
Token 权限必须含 repo,fine-grained 不行
GitHub 已停用密码和 OAuth App 认证,但 Composer 目前只支持 classic 类型的 Personal Access Token(不是 fine-grained),且权限必须勾选 repo(等价于旧版的私有库读写)。
-
read:packages仅当你使用 GitHub Packages(如ghcr.io上的私有 Composer 包)时才需要 -
delete:packages、admin:org等高危权限完全没必要,Composer 从不 push 或删包 - 如果组织启用了 SSO,即使 token 权限正确,也得去 GitHub 的
Settings → Applications → Authorized OAuth Apps页面手动 approve 该 token - 生成后立刻复制,页面关闭就再也看不到明文 —— 别指望“重新生成”能复用旧权限,修改权限必须新建 token
GitLab / Bitbucket 私有库不能用 github-oauth
GitLab 和 Bitbucket 不兼容 github-oauth 配置项,必须走 http-basic 结构,且域名必须与仓库 URL 完全一致(含端口、子域)。
- GitLab 示例:
composer config -g http-basic.gitlab.example.com your-username glpat-xxx—— 第二个参数是用户名(不是邮箱),第三个是 token;若用gitlab.example.com:8080,配置域名也必须带端口 - Bitbucket 只认 App Password,不是 OAuth token:
composer config -g http-basic.bitbucket.org your-username your-app-password,权限至少勾Repositories: Read - 仓库 URL 必须以
.git结尾(如https://bitbucket.org/workspace/repo.git),否则 Composer 会误判为 dist 源并调用禁用的 API - 自建 GitLab 若启用了 CI_JOB_TOKEN,它不被 Composer 支持 —— 只认用户级 Personal Access Token
COMPOSER_AUTH 是 CI 场景下的实际底线
本地开发用 composer config -g 最方便,但在 CI(如 GitHub Actions、GitLab CI)中,必须用 COMPOSER_AUTH 环境变量,因为全局配置无法动态注入 token。
- 值必须是合法 JSON 字符串,无换行、双引号包裹:
{"http-basic":{"gitlab.example.com":{"username":"token","password":"glpat-xxx"}}} - GitHub Actions 中,Secret 存的是整段 JSON,不是只存
${{ secrets.GITHUB_TOKEN }};GitLab CI 中可用$CI_JOB_TOKEN替换占位符,但替换后仍需保证 JSON 合法 -
COMPOSER_AUTH优先级高于所有本地auth.json,但格式错一个字符(比如多一个逗号)就会静默失效 - 别用
echo '{"http-basic":{}}' > auth.json这类命令生成文件 —— CI 日志可能捕获明文,且残留文件影响后续任务
真正容易被忽略的是:token 泄露等于交出 GitHub 账号。别 commit、别 log、别贴在 issue 里,哪怕只是调试时 echo $GITHUB_TOKEN 也可能被日志系统捕获。权限宁缺毋滥,域名一字不差,JSON 格式零容错 —— 这三点踩错任一,认证就白配。











