composer不支持通配符域名认证,需在auth.json中为每个私有源域名单独配置http-basic;项目级auth.json覆盖同域名的全局配置;ci推荐用composer_auth环境变量;认证失败主因是域名不匹配或误用basic方式传bearer token。

composer怎么配多个http-basic认证域名
Composer 本身不支持在 auth.json 里直接写“多域名共享同一套账号”的通配规则,每个域名必须单独声明。你不能写 "*.example.com": { ... },它会忽略或报错。
正确做法是把所有需要认证的私有源域名逐个列出来,哪怕它们共用同一组账号:
{
"http-basic": {
"repo1.example.com": {
"username": "user",
"password": "token123"
},
"repo2.example.com": {
"username": "user",
"password": "token123"
},
"packages.internal.company": {
"username": "user",
"password": "token123"
}
}
}
- 域名必须完全匹配,
https://repo.example.com和http://repo.example.com视为不同源(协议不同) - 子域名不自动继承,
pkg.example.com不会复用example.com的配置 - 如果用的是 GitLab / GitHub Packages,注意实际请求域名是
gitlab.example.com或maven.pkg.github.com,不是你仓库的主页域名
全局auth.json和项目级auth.json哪个优先
项目根目录下的 auth.json 会覆盖全局(COMPOSER_HOME/auth.json)配置 —— 但只覆盖「同域名」条目。比如全局写了 repo1.example.com,项目里也写了,项目生效;但项目没写的 repo2.example.com,仍会 fallback 到全局。
- 全局位置通常是:
~/.composer/auth.json(Linux/macOS)或%APPDATA%\Composer\auth.json(Windows) - 项目级
auth.json默认不提交到 Git,建议加进.gitignore;若需团队共享(如 CI 环境),改用环境变量方式注入 - CI 场景下推荐用
COMPOSER_AUTH环境变量传 JSON 字符串,避免文件权限/路径问题
为什么composer install还是提示Authentication required
常见不是账号错了,而是域名对不上。Composer 在拉包时请求的实际 host,和你在 auth.json 里写的 key 不一致,就会跳过认证。
- 检查
composer.json里的repositories配置:如果写的是"url": "https://packages.example.com",那auth.json必须用"packages.example.com",不能少个www或多一个api. - 运行
composer config -g --list | grep auth确认全局配置是否加载成功 - 加
-v参数重试:composer install -v,看日志里 “Readinghttps://xxx” 这一行的真实域名是什么 - 某些私有源(如 Satis、Private Packagist)会重定向,Composer 认证只发生在首次请求,重定向后的域名不会自动继承凭证
用HTTP Basic但实际是Bearer Token怎么办
很多现代私有源(GitLab、GitHub Packages、Artifactory)要求的是 Bearer Token,但 Composer 的 http-basic 只发 Authorization: Basic xxx。硬塞 token 当 password 会失败。
- GitLab:用 Personal Access Token 当
password,username填任意非空字符串(如gitlab),GitLab 接受这种“伪 basic” - GitHub Packages:必须用
github-oauth配置,而不是http-basic;http-basic对npm.pkg.github.com无效 - Artifactory:开启 “Basic Auth for Bearer Tokens” 选项后才支持把 token 当 password 用,否则得走
composer config http-basic...命令动态设置
最稳的方式是查你私有源文档里明确写的 Composer 认证方式 —— 很多时候它根本不是标准 HTTP Basic,只是用了相同 header 名字而已。










