Composer token认证失败本质是GitHub/GitLab的PAT未正确配置或失效,需确保权限(如repo、read:packages)、域名精确匹配及auth.json位置正确(~/.composer/auth.json),并用composer config --global配合--auth标志写入。

Composer 的 token 认证失败,本质是 GitHub(或 GitLab)的个人访问令牌(PAT)未正确配置或已失效,不是 Composer 本身的问题。 直接改 auth.json 或用 composer config 设置即可,但必须注意 token 权限、作用域和存储位置是否匹配当前项目/全局环境。
为什么 composer install 突然报 “Could not fetch … 401 Unauthorized”?
这是最典型的 token 失效信号。常见原因包括:
- GitHub 已停用密码认证(2021 年起),但旧版 Composer 缓存了凭据或仍尝试用账号密码登录
- 你生成的 token 没勾选
repo权限(私有库必需),或勾了但没刷新 token(修改权限后必须重新生成) -
auth.json被误删、权限设为 600 但属主不对(如 root 写入,普通用户执行 composer 时读不到) - 项目级
auth.json和全局~/.composer/auth.json冲突,后者优先级更高但内容过期
怎么安全地生成并配置 GitHub Token?
GitHub PAT 必须带 repo(读写私有库)、read:packages(读 GitHub Packages)、delete:packages(如需删包)——最低要求是 repo。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 去 https://www.php.cn/link/9c450eb90c31bc12f1691f235da5a0cc 创建新 token,Token description 建议写明用途(如 “composer-cli-2026”),方便后续审计或吊销
- 不要把 token 硬编码进
composer.json或提交到 Git;只存进auth.json - 运行
composer config --global github-oauth.github.com <your_token_here>(注意域名是github.com,不是api.github.com) - 验证是否生效:
composer config --global --list | grep github-oauth应输出非空值
GitLab 私有库 token 怎么配?不走 github-oauth
GitLab 不兼容 GitHub 的 github-oauth 配置项,必须用 http-basic 方式,并确保仓库 URL 是 HTTPS 格式(不是 git@…)。
- 在 GitLab 中生成 Personal Access Token,至少勾选
read_api和read_repository - 执行:
composer config --global http-basic.gitlab.example.com <username> <token>(把gitlab.example.com替换为你实际的 GitLab 域名) - 如果 Composer 报 “Authentication required” 且提示输入用户名/密码,说明它没读到
http-basic配置,检查域名是否完全匹配(含端口,如gitlab.example.com:8443) - 也可手动编辑
~/.composer/auth.json,结构如下:{ "http-basic": { "gitlab.example.com": { "username": "your_username", "password": "your_token" } } }
哪些地方容易被忽略?
token 生效依赖三个隐性条件:域名精确匹配、权限足够、文件可读。最容易翻车的是:
- 公司用了 GitHub Enterprise Server,但配置时写了
github.com—— 正确域名应是github.company.internal,且要配github-oauth.github.company.internal - 用
composer install --no-interaction在 CI 环境跑,却忘了把 token 注入到 runner 的~/.composer/auth.json,导致静默失败 - PHP 运行用户(如 www-data)和当前 shell 用户不一致,
--global写入的是当前用户家目录,但 Web 服务读的是另一个用户的~/.composer/auth.json - token 本身已过期(GitHub 不设自动过期,但企业策略可能强制 90 天轮换),而错误日志里不会提示“token expired”,只报 401

















