私有仓库访问令牌绝不能硬编码在composer.json中,必须通过auth.json(权限600、.gitignore保护)或环境变量注入,且https需启用tls验证、git源优先使用ssh密钥。

私有仓库访问令牌不能写进 composer.json
硬编码在 composer.json 的 repositories 或 scripts 里,等于把密钥提交到 Git——CI 日志、审计记录、开发者本地执行都会暴露。哪怕加了 // TODO: replace token 注释也没用。
常见错误现象:
-
"url": "https://token:abc123@repo.example.com"—— URL 中的凭据会被git log、composer diagnose -v等命令明文打印 -
"options": {"http": {"header": ["Authorization: Bearer abc123"]}}—— 这类配置会进入composer.lock,且不加密
正确做法是完全剥离凭证:只在 composer.json 中声明源地址,认证信息交由 auth.json 或环境变量注入。
auth.json 必须加 .gitignore 且禁用全局写入
auth.json 是 Composer 读取 HTTP Basic 认证的唯一默认位置,但它不是安全容器——文件内容纯文本,无加密,权限靠人工控制。
关键操作:
- 确保项目根目录下的
auth.json已加入.gitignore;若已提交,需用git rm --cached auth.json彻底移除历史记录 - 避免使用
composer config http-basic.repo.example.com user pass全局写入(即不加--global),否则该凭据会污染所有项目 - CI 中应动态生成
auth.json,例如:{ "http-basic": { "repo.example.com": { "username": "token", "password": "${GITHUB_TOKEN}" } } }再通过export GITHUB_TOKEN=xxx注入
注意:http-basic 的域名必须与仓库 URL 完全一致(如 https://repo.example.com 对应 repo.example.com),IP 地址或带端口的 host 会导致匹配失败。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
HTTPS + TLS 验证不可关闭,尤其私有源
私有仓库往往部署在内网或自建服务器上,容易让人误以为“反正不对外”,于是关掉 TLS 验证。这是高危操作。
后果包括:
-
"config": {"secure-http": false}或composer config secure-http false—— 所有私有源请求降级为 HTTP,凭据明文传输 -
"config": {"ssl-verify": false}—— 跳过证书校验,中间人可伪造响应并返回恶意包 - 自签名证书场景下,应改用
cafile指向可信 CA,而非禁用验证
验证是否生效:运行 composer diagnose,确认输出包含 HTTP proxy support is enabled 和 HTTPS is available;若提示 Warning: The configured cafile does not exist,说明证书路径错误,但至少比 ssl-verify: false 安全。
Git 类型私有源优先用 SSH 密钥,而非 HTTPS+Token
当私有包托管在 Git(GitHub/GitLab/自建 Gitea)时,"type": "vcs" 比 "type": "composer" 更轻量、更可控,且天然支持 SSH。
优势与实操要点:
- SSH 密钥可设为只读、限制 IP、绑定特定仓库,权限粒度远高于长期 Personal Access Token
- CI 中注入私钥后,只需配置 SSH agent:
eval $(ssh-agent -s) && ssh-add
- 确保仓库 URL 使用
git@repo.example.com:vendor/package.git格式,Composer 会自动调用git clone,跳过 HTTP 认证流程 - 若必须用 HTTPS,Token 应仅授予
read_package_registry(GitLab)或packages:read(GitHub),禁用write权限
真正难处理的不是“怎么传”,而是“谁有权读、读多久、读哪些”。传输加密只是起点,令牌生命周期管理、最小权限原则、以及镜像无法加速私有源的事实,才是压在配置背后的真实复杂性。










