私有仓库url本身无需隐藏,敏感的是凭据;应使用auth.json(权限600)或composer_auth环境变量管理认证信息,严禁将token等写入composer.json url中,否则会导致凭据泄露。

composer.json 里不能写私有仓库地址的认证信息,但“隐藏地址”本身是个误解——URL 地址本身不敏感,敏感的是凭据;真正要脱敏的是 token、username、password,不是 @#@#@#@#@#@#@#@#@#@0 这种路径。
为什么把 token 塞进 URL 是高危操作
常见错误写法:"url": "https://abc123:token@packagist.internal",这会让凭据直接进入 Git 历史,且 composer install -vvv 日志、CI 构建日志、composer show -p 输出中都可能明文泄露。
- Git 不会自动过滤 JSON 字符串里的敏感字段,删掉也难清历史
- Composer 从不校验 URL 内容,它只负责拼接并发起 HTTP 请求
- 一旦被 commit 过,就算加了
.gitignore也晚了,必须用git filter-repo或类似工具重写历史
auth.json 是唯一受支持的凭据载体
Composer 只认 auth.json 文件加载认证,且仅在权限为 600(Linux/macOS)或等效安全设置(Windows)时才读取。它不接受环境变量注入凭据(除非用 COMPOSER_AUTH),也不读取 config.json 或命令行参数中的认证字段。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目级
auth.json必须放在与composer.json同级目录,内容如:{"http-basic": {"satis.internal": {"username": "deploy", "password": "xxx"}}} - 全局
auth.json路径由composer config --global --list | grep config-home查看,Linux/macOS 默认是~/.composer/auth.json - 必须执行
chmod 600 auth.json,否则 Composer 直接忽略该文件 - 确认未被 Git 跟踪:
git check-ignore -v auth.json,无输出就说明没 ignore,需补进.gitignore
COMPOSER_AUTH 环境变量适合 CI 场景
CI/CD 中挂载文件风险高(比如挂错路径、权限不对、覆盖失败),改用环境变量更可控。Composer 会优先读取 COMPOSER_AUTH 的值,格式是 JSON 字符串,不是文件路径。
- GitHub Actions 示例:
COMPOSER_AUTH: '{"http-basic": {"satis.internal": {"username": "${{ secrets.DEPLOY_USER }}", "password": "${{ secrets.DEPLOY_PASS }}"}}}' - Docker BuildKit 中可用
--secret注入,再在构建阶段 export 为环境变量 - 注意:该变量值必须是合法 JSON,引号要转义,空格不能多,否则
composer diagnose会报Invalid credentials JSON
私有仓库 URL 本身要不要隐藏?
不需要。内网域名如 satis.internal、gitlab.company.com 属于基础设施信息,不等同于密钥。真正要保护的是访问控制能力,而非地址可见性。强行混淆 URL(比如 base64 编码、拆成变量拼接)反而破坏 Composer 解析逻辑,导致 Unable to load package list 且无明确提示。
- URL 必须完整、可直连、返回有效
packages.json(含正确 MIME 类型application/json) - 若用 Nginx 托管 Satis,确保
location ~ \.json$块里有add_header Content-Type application/json; - 禁用 Packagist 回退必须显式写:
{"packagist.org": false},作为repositories数组中独立一项
真正的安全边界在凭据生命周期管理——不是藏 URL,而是让凭据不落地、不进 Git、不进日志、不跨环境复用。一旦 auth.json 权限设错或 COMPOSER_AUTH 格式非法,Composer 就静默跳过认证,然后报 “package not found”,这个失败点非常隐蔽。










