composer 要求输入 token 是因 packagist 对匿名 api 请求限频,需通过 auth.json 配置 github/gitlab 等平台的 oauth token 或 personal access token 以通过认证,且每个域名须单独配置。

为什么 Composer 会突然要你输 token?
这不是网络问题,也不是权限被封了——是 Packagist(尤其是 packagist.org)对匿名 API 请求做了限频,当你频繁执行 composer update、composer install 或依赖里有大量私有包时,它就直接拦住,抛出 Authentication required 错误。本质是 Composer 在调用 Packagist API 时没带有效身份凭证,被当成“未登录游客”拒了。
常见触发场景:
• 在 CI/CD 流水线里反复拉包
• 本地开发机换了网络环境后首次运行 update
• 公司内网没配好代理,请求全走默认出口 IP,被连带限流
怎么配 GitHub/GitLab token 让 Composer 过认证?
Composer 不自己存密码,而是靠 auth.json 文件告诉它“去哪拿凭证”。这个文件必须放在正确位置,且格式不能错:
-
auth.json要放在 Composer 的配置目录下:Linux/macOS 是~/.composer/auth.json,Windows 是%APPDATA%\Composer\auth.json - 内容必须是 JSON 对象,顶层 key 是
github-oauth或gitlab-token,不是tokens或oauth - GitHub token 需要有
read:packages和delete:packages(如果要发布),GitLab token 至少得是apiscope
示例(GitHub):
{
"github-oauth": {
"github.com": "ghp_abc123..."
}
}
注意:ghp_... 是 Personal Access Token,不是 SSH key,也不是密码;生成时别漏选 read:packages —— 否则照样报错。
Composer config 命令配 token 为啥有时不生效?
用 composer config --global github-oauth.github.com xxx 看似方便,但容易踩三个坑:
- 命令写错 host 名:比如写成
github.com没问题,但写成api.github.com或www.github.com就完全不认 - token 存进了用户级配置(
~/.composer/config.json),但项目里存在composer.json的config字段覆盖了它 - CI 环境里用了
--no-interaction,而 Composer 检测到 auth 缺失时会静默跳过提示,导致后续请求仍 401
建议:优先手写 auth.json,比 config 命令更可控;CI 中可加一步校验:composer config --global --list | grep github-oauth 确保值已落盘。
私有 GitLab/Bitbucket 包认证失败的特殊处理
Packagist.org 只管公开包,但如果你的 composer.json 里写了 "type": "package" 或自建仓库(如 Satis、Private Packagist),认证逻辑就变了:
- GitLab 私有实例需在
auth.json里用gitlab-token,host 写完整地址(含端口,如gitlab.example.com:8080) - Bitbucket Cloud 要用
bitbucket-oauth,且 token 必须通过 Bitbucket OAuth consumer 创建,不能用 App Password - 自建 Satis 服务若开了 HTTP Basic Auth,就得在
repositories的 URL 里直接写https://user:pass@your-satis.com,auth.json不起作用
关键点:Composer 不会自动把一个 token 复用到所有 Git 域名,每个 host 都得单独配;漏配一个,那个包就会卡在 Downloading... 然后超时或 401。
Token 生效不是一劳永逸的事——GitHub 可能随时失效(比如你删了 token、改了两步验证策略),GitLab 实例升级后可能要求更高 scope。最常被忽略的是:错误信息里写的 Authentication required 并不指明是哪个域名卡住,得看 Composer 输出的上一行 URL 才知道该去配谁。










