答案是auth.json路径、权限、字段名及域名key必须严格匹配:linux/macos为~/.composer/auth.json且chmod 600;字段仅认"http-basic";域名key须与repositories.url的host完全一致(含端口),否则composer静默跳过。

私有仓库权限配置失败,90% 是因为 auth.json 没放对位置、字段写错,或域名 key 和 repositories.url 的 host 不完全一致——Composer 会静默跳过,不报错也不提示。
auth.json 路径和权限必须严格匹配系统规范
Composer 只在固定路径读取全局认证文件,写错位置等于没配。
- Linux/macOS:必须是
~/.composer/auth.json(不是项目根目录、不是~/.config/composer/auth.json) - Windows:必须是
%APPDATA%\Composer\auth.json - 权限必须设为
600:chmod 600 ~/.composer/auth.json,否则 Composer 直接忽略该文件
http-basic 字段结构不能有任何偏差
GitLab、GitHub、Bitbucket 等都只认 http-basic 这个字段名,其他如 gitlab-token、oauth、access_token 全无效。
- GitLab 示例(必须用
oauth2作 username):{ "http-basic": { "gitlab.example.com": { "username": "oauth2", "password": "glpat-xxx" } } } - GitHub 示例:
{ "http-basic": { "github.com": { "username": "your-github-username", "password": "ghp_xxx" } } } - Bitbucket 示例(必须用 App Password,且字段嵌套两层):
{ "http-basic": { "bitbucket.org": { "username": "your-bitbucket-username", "password": "app-password-here" } } }
域名 key 必须和 repositories.url 的 host 完全一致
这个“完全一致”是指协议、端口、路径、斜杠全部排除,只比对纯 host 字符串。
- 如果
repositories.url是https://gitlab.example.com:8443/team/pkg.git,key 就得是"gitlab.example.com:8443" - 写成
"https://gitlab.example.com"、"gitlab.example.com/"、"gitlab.example.com:443"都不匹配 - CI/CD 中常见陷阱:GitLab 实例部署在子路径(如
/gitlab),URL 写成https://example.com/gitlab/team/pkg.git,那 key 就是"example.com",不是"example.com/gitlab"(路径不参与匹配)
HTTPS 认证下 Token 权限要开对
Token 不是“开了 API 就能用”,不同平台要求的最小权限不同,缺一不可。
- GitLab:必须勾选
read_repository(api权限不覆盖 Git 读取) - GitHub:必须含
repo(不是仅public_repo) - Bitbucket:必须启用
repository:read+account:read,且用 App Password,不用账号密码 - 验证方式:手动执行
curl -H "Authorization: Basic $(echo -n 'user:token' | base64)" https://gitlab.example.com/api/v4/projects,看是否返回 200
最常被忽略的一点:所有配置项都生效的前提是 repositories 在 composer.json 顶层、type 为 vcs、URL 以 .git 结尾——权限再对,源本身没被识别,就根本不会走到认证环节。











