敏感信息必须抽离到 auth.json 并确保其被 .gitignore 忽略,优先使用 composer config --global 写入凭据,ci 环境应改用环境变量注入,且需定期验证密钥未泄露。

composer.json 里别硬编码 API 密钥
很多项目在 composer.json 的 repositories 或 config 字段里直接写私有仓库的 token,比如:"url": "https://token:xxx@repo.example.com"。这等于把凭证明文塞进 Git 历史——删都删不干净。
- 敏感信息必须抽离到
auth.json,且该文件默认不被 Composer 提交(但你得确保它真没被 git track) -
auth.json放在用户主目录(~/.composer/auth.json)最安全;项目级可放./auth.json,但必须加进.gitignore - 如果用
composer config --auth命令写入,它会自动选对位置、设好权限(600),比手动编辑靠谱
检查 .gitignore 是否漏掉 auth.json
常见错误是只忽略 vendor/ 和 composer.lock,却忘了 auth.json。一旦它被 commit 过,后续加 ignore 也救不回历史里的密钥。
- 运行
git check-ignore -v auth.json确认是否真被忽略 - 如果输出为空,说明没生效;补上
auth.json到.gitignore后,再执行git rm --cached auth.json(仅从索引移除,保留本地文件) - 私有 Packagist 类服务(如 Satis、Private Packagist)的配置也常藏在
auth.json,一并检查
用 composer config 的 --global 和 --local 区分作用域
composer config 默认写入当前项目(--local),但 API 凭据这类全局凭据,应该用 --global 写进用户目录,避免项目配置污染。
-
composer config --global github-oauth.github.com abc123→ 安全,只存本地 -
composer config github-oauth.github.com abc123→ 默认--local,会改composer.json,风险高 -
--global写的配置优先级低于--local,所以项目里误写密钥仍可能覆盖全局设置——得靠流程卡住,不是靠优先级兜底
CI 环境下别用 auth.json 文件,改用环境变量注入
GitHub Actions、GitLab CI 等环境里,往工作机写 auth.json 文件既不安全也不可控。Composer 本身支持从环境变量读取凭证,更干净。
- 设置环境变量:
COMPOSER_AUTH='{"github-oauth": {"github.com": "xxx"}}' - 或者拆开:
GITHUB_TOKEN=xxx,再在composer.json里用${GITHUB_TOKEN}占位(需 Composer 2.2+) - 注意:环境变量方式不兼容所有私有源协议,比如某些自建 Artifactory 需要
http-basic类型,得查对应文档确认是否支持变量替换
真正难防的不是“不知道怎么配”,而是配完没验证是否真的没进 Git,以及多人协作时有人绕过规范手写密钥。定期跑 git grep -i "token|oauth|password" -- composer.json 比等泄露后再补救强得多。










