composer的http-basic配置默认写入全局auth.json且同域名凭证会被新值覆盖,非叠加;应优先使用项目级auth.json或composer_auth环境变量管理多仓库凭证,严禁将敏感信息提交至git。

直接结论:别用 composer config --global http-basic 反复覆盖,优先用项目级 auth.json 或 COMPOSER_AUTH 环境变量,敏感信息绝不能进 composer.json 或 Git。
为什么 composer config http-basic 只生效一个仓库?
因为每次执行该命令,默认写入全局 ~/.composer/auth.json,而同一域名的凭证会被新值覆盖——不是“添加”,是“替换”。比如你先配了 pkg.a.com,再配 pkg.b.com,结果只有后者保留;若两次都配 pkg.a.com,前者就彻底丢失。
- 凭证键只认域名一级,如
pkg.example.com,不认https://pkg.example.com/api/v1或www.pkg.example.com - Composer 请求时看的是 HTTP
Host头,不是 URL 路径,所以反向代理场景下要配代理域名(如composer.mycompany.com),不是后端真实地址 - 运行
composer install -v会输出Checking http-basic authentication列表,可快速核对当前加载了哪些域名凭证
怎么安全地写多个私有仓库凭证?
推荐两种方式,都绕过全局覆盖风险:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在项目根目录执行:
composer config --auth http-basic.pkg1.example.com user1 token1(不加--global),它会写进当前项目的auth.json,优先级高于全局,且不会影响其他项目 - 手动编辑项目根目录下的
auth.json(没有就新建),按标准 JSON 格式填,例如:{ "http-basic": { "pkg1.example.com": { "username": "user1", "password": "token1" }, "pkg2.internal": { "username": "svc-composer", "password": "xxx" } } } -
auth.json必须加进.gitignore;如果用了 CI/CD,确保构建机上没残留旧的全局auth.json
CI/CD 中怎么避免硬编码 Token?
用 COMPOSER_AUTH 环境变量最干净,它优先级最高,且内容是 JSON 字符串,适合平台 secret 注入:
- 值必须是合法 JSON,例如:
{"http-basic":{"pkg.example.com":{"username":"token","password":"abc123"}}} - GitHub Actions 中这样写:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }},Secret 里存的就是上面那段 JSON - GitLab CI 中若用
vcs类型仓库(如"url": "https://gitlab.com/group/pkg.git"),仅配http-basic不够——git clone阶段仍会失败,得额外在composer.json里加git_source模板,再用sed替换占位符 - 绝对不要在 CI 脚本里用
composer config动态写文件,容易留痕迹、日志泄露、权限混乱
哪些操作是高危雷区?
这些做法看似省事,实际等于把钥匙挂在门把手上:
- 把 Token 直接塞进
composer.json的repositories.url字段,比如"https://user:pass@pkg.example.com"—— Composer 会解析失败或忽略,且一旦提交 Git 就全网可见 - 用
git config --global credential.helper store存凭据 —— 不同 CI Job 可能混用,且无法按项目隔离 - 在
composer.json里用{%VARIABLE}占位符却不装ffraenz/private-composer-installer插件 —— 安装直接报 403 - 用个人长期 Token 而非
$CI_JOB_TOKEN这类临时凭证 —— 泄露后影响面极大,且难追溯
真正麻烦的从来不是配置本身,而是凭证生命周期管理:域名是否拼错、Token 权限是否最小化、auth.json 是否被意外提交、CI 中环境变量是否被调试模式打印出来——这些细节漏掉一个,安全就归零。










