auth.json必须加入.gitignore且未被历史提交过,否则凭据已泄露;需用git ls-files检查是否已被跟踪、git check-ignore验证忽略是否生效,若已提交则执行git rm --cached auth.json并补入.gitignore。

auth.json 必须进 .gitignore,且得确认它没被历史提交过
只要 auth.json 出现在 Git 历史里,凭据就等于已泄露——删文件、改 .gitignore 都救不回来。这不是“忽略就能完事”的问题,而是“有没有进过索引”的事实判断。
- 检查是否已被跟踪:
git ls-files | grep auth.json—— 有输出说明它早就在历史里了 - 检查是否被正确忽略:
git check-ignore -v auth.json—— 若无输出,说明.gitignore没生效 - 如果已被提交过,立刻执行:
git rm --cached auth.json(只从索引移除,保留本地文件),再往项目根目录的.gitignore补一行auth.json - 别依赖 IDE 自动写入:PHPStorm 等工具可能默认勾选 “store credentials in project”,得手动关掉对应设置
/vendor 目录的忽略规则必须带开头斜杠
/vendor 和 vendor 是两回事。不加 / 会误匹配 myvendor.php、src/vendor_api/ 这类完全无关的路径,而真正要屏蔽的只是项目根目录下的 vendor/ 目录。
- 在
.gitignore中写成:/vendor(不是vendor,也不是vendor/) - 改完后必须执行:
git rm -r --cached vendor—— 否则旧缓存还在,新人克隆后git status仍会报一堆未暂存修改 - 顺手补上:
vendor/bin/和composer.phar,它们和/vendor一样属于可再生产物,不该进版本库
CI 环境下不能靠 auth.json 文件,得用 COMPOSER_AUTH 环境变量
GitHub Actions 或 GitLab CI 的 runner 上没有你的 ~/.composer/auth.json,也没交互终端让你输密码。硬塞一个 auth.json 文件进去,既权限难控,又容易明文残留。
- GitHub Actions 写法:
env: COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }} - GitLab CI 写法:
variables: COMPOSER_AUTH: "$COMPOSER_AUTH"(配合 pipeline secrets 注入) - 避免用
echo生成文件:JSON 格式易错、权限常设错(比如 644)、内容还可能被日志打印出来 - 注意 key 格式:私有 Packagist 域名必须完全匹配,
packagist.example.com和https://packagist.example.com在auth.json结构里是两个不同 key,少个协议头就失效
真正容易被忽略的验证点
配完 .gitignore 和全局 auth.json,很多人就以为安全了。但以下三点不验证,等于留了后门:
-
git log -p --grep=auth.json—— 看它是否真没进过任何一次 commit - 团队成员是否统一用了
composer config --global --auth,而不是各自在项目里跑composer config --auth(后者默认写进当前目录,极易误提交) -
composer.lock是否已提交且与composer.json对齐 ——.gitignore再干净,lock 文件脱节照样导致环境不一致











