composer私有源授权凭据存于全局auth.json(linux/macos为~/.composer/auth.json,windows为%appdata%\composer\auth.json),而非缓存目录;删cache-dir无效,因授权与缓存分离,401错误根源在auth.json中过期或错误的凭据。

Composer私有源授权缓存存在哪
Composer不把HTTP Basic Auth凭据存在~/.composer/cache/里,而是写进全局配置文件auth.json(Linux/macOS默认在~/.composer/auth.json,Windows在%APPDATA%\Composer\auth.json)。这个文件会被composer install和composer update自动读取,用于向私有源(如GitLab、Nexus、Satis)发起带Authorization: Basic ...头的请求。
为什么删cache-dir没用
执行composer clear-cache或手动删~/.composer/cache/完全不影响授权状态——它只清包文件、元数据和Git裸仓库,不碰auth.json。常见误操作是反复清缓存后仍报401 Unauthorized或Could not authenticate against private.repo.example.com,根源就在auth.json里存了过期Token、错位用户名或被Base64编码污染的密码。
- 检查是否存在:
ls -l $(composer config --global home)/auth.json - 查看内容(敏感信息已脱敏):
cat $(composer config --global home)/auth.json | jq .(需jq)或直接cat看明文结构 - 典型错误结构:
{"http-basic":{"private.repo.example.com":{"username":"user","password":"old-token"}}—— password字段值已失效
怎么安全清理并重置私有源凭证
别直接rm auth.json,否则会连其他私有源配置一并丢失。推荐用composer config命令精准删除:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 删单个域名凭证:
composer config --global --unset http-basic.private.repo.example.com - 删全部HTTP Basic配置:
composer config --global --unset http-basic - 确认已删干净:
composer config --global http-basic应返回空或报Key "http-basic" does not exist - 重新登录(触发交互式输入):
composer config --global http-basic.private.repo.example.com private.repo.example.com username,回车后输入密码(不显示)
注意:如果私有源用的是Personal Access Token(如GitLab),密码字段填Token值即可,无需额外Base64编码——Composer内部会处理。
CI环境或无交互场景下如何绕过缓存凭据
CI中auth.json常由环境变量注入,但若凭据变更而缓存未刷新,composer install可能复用旧凭据失败。此时不能依赖--no-cache,必须强制跳过凭据缓存逻辑:
- 临时禁用
auth.json:COMPOSER_AUTH="" composer install - 或指定空凭据文件:
composer install --auth-file /dev/null - Docker构建时更稳妥:
RUN --mount=type=secret,id=composer_auth cp /run/secrets/composer_auth /root/.composer/auth.json && composer install,避免凭据硬编码进镜像层
真正容易被忽略的是:某些私有源(比如自建Satis)要求auth.json中username字段为token,而password才是实际Token值;填反了就永远401,且错误日志里不会提示字段语义问题。










