必须用auth.json配置且权限为600,否则Composer静默跳过;认证类型须匹配私有源(如http-basic用于Satis/GitLab、github-oauth用于GitHub);域名key必须与仓库URL的host:port完全一致,包括端口、大小写,且编码为UTF-8无BOM。

必须用 auth.json 配置,且权限必须是 600,否则 Composer 会静默跳过——不是报错,而是假装没这回事。
确认认证方式是否匹配私有源类型
私有源如果是 HTTP(S) 基础认证(比如自建 Satis、Nexus 或 GitLab 的 packages.json 接口),就只能用 http-basic;如果是 GitHub 私有仓库,得用 github-oauth;GitLab 实例则优先走 gitlab-oauth 或 gitlab-token。用错类型,比如对 GitLab 写 github-oauth,凭据根本不会被读取。
- 运行
composer config --global --list | grep -E "(http-basic|github-oauth|gitlab-token|bearer)"查看当前已注册的认证项 - 如果输出为空,说明凭据没写入或格式错误,不要手动编辑文件,直接用
composer config命令生成 - 例如配置 GitLab 基础认证:
composer config --global http-basic.gitlab.internal username your-password,它会自动创建标准 JSON 结构并处理引号和逗号
域名必须和仓库 URL 的 host:port 完全一致
假设你的私有源地址是 https://gitlab.internal:8080/api/v4/projects/123/packages/composer,那么 auth.json 中的 key 必须是 "gitlab.internal:8080"。少端口、多 https://、加路径、大小写不一致,全都会导致认证失败,且 Composer 不提示原因,只返回 401。
- 检查方式:用
curl -I https://gitlab.internal:8080/确认能通,再比对auth.json里 key 是否一字不差 - Linux/macOS 下执行
ls -l ~/.composer/auth.json,确保权限是-rw-------(即600);Windows 用户忽略此条,但要确认%APPDATA%\Composer\auth.json存在且未被系统策略拦截 - 用
file -i ~/.composer/auth.json检查编码,必须是charset=utf-8;若显示utf-8-with-bom,用 VS Code 以“UTF-8 无 BOM”保存
项目级 auth.json 放错位置等于没配
项目级 auth.json 必须和 composer.json 在同一目录下,不能放在 vendor/、src/ 或任何子目录里。Composer 只查三个位置:① 当前项目根目录 → ② COMPOSER_HOME(通常是 ~/.composer/)→ ③ 系统级目录。放错就彻底失效。
- 项目级配置适合 CI/CD 场景,但必须加进
.gitignore,否则密钥泄露 - 全局配置更省事,但多个团队共用一台机器时,不同项目的凭据可能冲突
- 环境变量方式(
COMPOSER_AUTH)可用于容器或 CI,内容需是合法 JSON 字符串,如:{"http-basic":{"repo.example.com":{"username":"u","password":"p"}}}
最容易被忽略的是权限和域名匹配——前者让 Composer 直接跳过文件,后者让请求发出去却没人认你。这两点不出问题,Could not authenticate 就基本排除了。


















