报错“invalid credentials”90%因auth.json格式错误、路径错误或凭据失效;需确保文件位于项目根目录或~/.composer/auth.json,JSON合法且键名正确,凭据权限充足,协议与repositories中URL一致。

报错提示“invalid credentials”或“Could not fetch package, invalid auth.json”时,90% 是 auth.json 文件内容格式错误、路径错位或凭据过期,不是账号密码输错了。
auth.json 文件位置和加载顺序必须对得上
Composer 只认两个地方的 auth.json:项目根目录下的 ./auth.json(优先级最高),以及全局的 $(composer config --global home)/auth.json(通常是 ~/.composer/auth.json)。它不会自动读 ~/.composer/config.json 里的凭据字段,也不会从环境变量或命令行参数里提取。
- 运行
composer config --list | grep -i auth查看当前生效的 auth.json 路径 - 如果输出里
github-oauth或http-basic配置为空或显示null,说明文件没被加载,先确认路径是否存在且可读 - 项目级
auth.json必须和composer.json同目录;放错位置(比如丢进vendor/或config/)等于没写
JSON 格式稍错一点就完全失效
auth.json 必须是合法 JSON,且顶层必须是对象({}),不能是数组([])或裸字符串。常见手误包括:
- 末尾多逗号:
"github-oauth": {"github.com": "xxx",}→ 删除最后一个逗号 - 用单引号代替双引号:
'github.com': 'xxx'→ 全部改用双引号 - 键名拼错:
github-oath、gitbub-oauth→ 正确是github-oauth - 私有仓库配
http-basic时,URL 写成https://packagist.org这种公开源地址 → 应该填你自己的私仓域名,比如https://repo.mycompany.com
验证是否合法:用 jq . ~/.composer/auth.json(或在线 JSON 校验工具)跑一遍,不报错才算过关。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
凭据本身可能已失效或权限不足
GitHub Token、GitLab Personal Access Token、私仓 Basic Auth 的用户名密码,都可能因过期、撤回、范围(scope)缺失而拒绝访问。
- GitHub Token 至少要带
read:packages(私有包)或public_repo(公开包);若用在 GitHub Actions,还需勾选workflow权限 - GitLab Token 需含
read_api和read_repository;自建 GitLab 注意检查packages_enabled是否开启 - 私仓 Basic Auth 的用户名不能是邮箱(某些 Nexus/Artifactory 强制要求登录名是 user ID,不是 email)
- 临时测试可用
curl -u "user:token" https://repo.example.com/packages.json直接验证凭据是否能通
插件或环境干扰导致凭据被跳过
某些全局插件(如 hirak/prestissimo)或自定义脚本会绕过 Composer 原生认证流程;Docker 容器或 CI 环境中,$HOME 指向错误也会让全局 auth.json 加载失败。
- 加
--no-plugins参数重试:composer install --no-plugins,成功则说明插件冲突 - CI 中检查
COMPOSER_HOME是否被覆盖,比如 GitHub Actions 默认设为/home/runner/.composer,但有些自定义镜像把它改成/root/.composer - Docker 构建时,确保
auth.json是以构建用户(非 root)身份 COPY 进去的,否则文件属主是 root,Composer 读不到
最常被忽略的是:私有仓库 URL 在 repositories 字段里写的是 HTTP,但 auth.json 配的是 HTTPS 地址——协议不一致,凭据根本不会被匹配使用。

















