全局Token必须用composer config -g github-oauth.github.com 写入,且须为classic类型、含repo和read:packages权限,否则认证静默失效并报“Could not fetch”。

全局 Token 必须用 composer config -g 写入,且域名、token 类型、权限三者必须严格匹配,否则 composer install 会静默跳过认证,只报 “Could not fetch”。
github-oauth.github.com 配置必须用 classic token
GitHub 的 Personal Access Token 必须是 Tokens (classic) 类型,在 Settings → Developer settings → Personal access tokens → Tokens (classic) 创建。OAuth tokens 或 fine-grained tokens 不被 Composer 支持。
- 权限至少勾选
repo(读写私有库)、read:packages(拉 GitHub Packages) - 命令必须是
composer config -g github-oauth.github.com <your-token></your-token>—— 注意是-g,不是--global(拼错参数会导致写进项目级auth.json,CI 环境下极易出问题) - 验证是否生效:
composer config -g github-oauth.github.com应输出***,不是空行或报错
gitlab-oauth.gitlab.com 和自建 GitLab 域名不能混用
GitLab 官方托管用 gitlab-oauth.gitlab.com;但如果你用的是 gitlab.example.com 或带端口的 gitlab.example.com:8080,就必须用对应完整域名配置,Composer 不做任何域名归一化。
- Token 类型必须是 Personal Access Token,不是 Deploy Token 或 CI Token
- 权限必须含
read_repository,仅勾api或read_user会导致 401,但错误日志里不提示具体缺哪项 - 命令示例:
composer config -g gitlab-oauth.gitlab.example.com <your-token></your-token> - 若用自建站,
repositories中 URL 必须与配置域名一致,比如"url": "https://gitlab.example.com/group/pkg.git"
bitbucket.org 只认 app password,且必须走 http-basic 结构
Bitbucket 已弃用 OAuth consumers,Composer 唯一支持的方式是 App Password,并强制要求以 http-basic 格式存入 auth.json —— 所以不能用 bitbucket-oauth 命令,而要用 http-basic。
- 创建路径:
Bitbucket Settings → App passwords → Create app password,权限至少勾Repositories: Read - 正确命令:
composer config -g http-basic.bitbucket.org your-username your-app-password - 注意:第二个参数是用户名(不是邮箱),第三个是 App Password(不是 token 字符串)
- URL 在
repositories中必须是https://bitbucket.org/workspace/repo.git,且type必须为vcs
COMPOSER_AUTH 环境变量是 CI 场景下的实际底线
本地配 -g 很方便,但在 GitHub Actions、GitLab CI 等环境,硬依赖全局 auth.json 极易因缓存、多项目共用或权限隔离失败。此时 COMPOSER_AUTH 是唯一可控入口。
- 值必须是合法 JSON 字符串,无换行,双引号闭合:
{"http-basic":{"gitlab.example.com":{"username":"glpat-xxx","password":""}}} - GitHub Packages 要用
github.com域名;GitLab CE 自建站必须用真实访问域名(含端口) - 不要用
echo '{...}' > auth.json这类操作——残留文件可能被日志捕获,且优先级低于COMPOSER_AUTH - 运行
composer install -vvv时,能看到Authorization: Basic ...或Authorization: Bearer ...才算真正生效
最常被忽略的一点:即使 Token 配对了,如果 composer.json 里没声明 "type": "vcs" 或 URL 不是 HTTPS 格式,Composer 根本不会触发认证流程 —— 它连 token 都懒得读。


















