必须配置GitHub Personal Access Token,否则Composer匿名请求受限于每小时60次;需执行composer config --global github-oauth.github.com 全局写入,并确保~/.composer/auth.json权限为600、域名严格匹配github.com。

当你在执行composer install或composer update时突然卡住、报错“Could not fetch https://api.github.com/”或提示“Token input required”,说明 Composer 正在尝试访问 GitHub API 却拿不到合法凭证——这不是网络问题,而是认证缺失导致的限流拦截,必须配置 Token 才能继续。
配置 GitHub OAuth Token(全局生效)
这一步必须做,且只能设为全局;项目级配置对 GitHub API 限流无效,写了也白写。
第一步:登录 GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token
勾选 【repo】 权限(读私有库必需),其他权限一律不勾;生成后页面只显示一次,立刻复制整段字符串(开头是ghp_,共40位,含大小写字母和数字)。
第二步:在终端中运行命令→composer config --global github-oauth.github.com ghp_abc123def456(把ghp_abc123def456替换成你刚复制的完整 Token)
第三步:验证是否写入成功→执行composer config --global github-oauth.github.com,应原样返回你的 Token 字符串;若返回空,说明写入失败,检查是否漏了--global参数或路径权限问题。
配置 GitLab Private Token(按域名区分)
GitLab 自建实例(如git.example.com)不能复用github-oauth字段,必须单独配gitlab-token并声明域名。
方法一:命令行直接写入(推荐用于单域名)
先生成 GitLab Private Token:进入 User Settings → Access Tokens → 创建,勾选read_api和read_repository,复制 Token;再执行:composer config --global gitlab-token.git.example.com your_gitlab_token_here
方法二:手动编辑auth.json(适合多域名或 CI 环境)
打开~/.composer/auth.json(Windows 是%APPDATA%\Composer\auth.json),确保文件包含以下结构:{"gitlab-domains":["git.example.com"],"gitlab-token":{"git.example.com":"your_gitlab_token_here"}}
【注意:gitlab-domains 必须显式声明,否则 Composer 不会向该域名发送 Token】
Bitbucket App Password 配置(HTTPS 认证专用)
Bitbucket 已全面停用账号密码登录 API,必须用 App Password 替代,且权限必须精确匹配。
进入 Bitbucket 账户设置 → App passwords → Create app password
名称随意,但权限至少勾选 【account:read】和【repository:read】,生成后立即复制(同样只显示一次)
执行命令:composer config --global http-basic.bitbucket.org your_bitbucket_username your_app_password
用户名填你登录 Bitbucket 的邮箱前缀(如user@example.com就填user),App Password 粘贴进去即可
这一步操作起来很简单,直接把文件拖进去就行。但别用邮箱全名当用户名,否则认证永远失败。
验证配置是否生效
运行composer clear-cache清除旧缓存,避免残留未认证请求干扰
执行composer show packagist/packagist --verbose(一个公开包即可),观察输出中是否出现Downloading https://api.github.com/后不再中断或报 403
若仍失败,立即检查 Token 是否过期、是否多复制了空格、是否在错误的 shell(如 PowerShell)里执行导致$被解析——换 CMD 或直接改auth.json最稳妥


















