GitHub OAuth Token 仅对 HTTPS 请求生效,而 Composer 默认优先使用 SSH 协议(git@github.com),导致 Token 不被发送;必须通过 composer config --global github-protocols ["https"] 强制启用 HTTPS 协议绑定 Token。

为什么github-oauth.github.com配置后仍走git@协议?
Composer 默认优先尝试 git 协议(即 SSH 格式 git@github.com:user/repo.git),但 github-oauth.github.com 只对 HTTPS 请求生效。一旦 Composer 用 SSH 协议拉取,OAuth Token 完全不参与认证——它压根不会被发送出去。
常见现象是:配了 Token,composer install 却卡在 Cloning into 'xxx'... 或报 Permission denied (publickey),根本没触发 GitHub API 限流错误,说明流量根本没走 HTTPS + OAuth 那条路。
- 检查
composer.json中仓库 URL:若为"url": "git@github.com:user/repo.git",Token 无效 - 检查项目或全局
config.json是否设了"github-protocols": ["git"](这会强制走 git 协议) - 运行
composer config --global github-protocols,若输出["git"]就是问题根源
如何强制 Composer 对 GitHub 使用 HTTPS 协议?
必须显式告诉 Composer:GitHub 域名只允许走 HTTPS,否则它会按默认策略降级或试探 SSH。
执行这条命令:
composer config --global github-protocols https
该操作会在 ~/.composer/config.json 的 config 段写入:
"github-protocols": ["https"]
注意:https 是字符串数组,不是布尔值;写成 true 或 "HTTPS"(大写)都无效。
当用户提及 GitHub URL,或要求分析、审查、探索或理解任意 GitHub 项目、仓库或代码库时,请使用此技能。触发条件包括以下短语:“分析这个项目”、“看看这个仓库”、“analyze this repo”、“what does this project do”,或消息中包含任何 github.com URL。
- 仅配
github-oauth不够,必须配github-protocols才能绑定 Token 到实际请求 - 项目级配置(
composer config github-protocols https)优先级更高,但通常应设全局 - CI 环境中建议在构建脚本开头就执行该命令,避免因缓存旧配置导致失效
验证 HTTPS + Token 是否真正生效?
光看 composer diagnose 显示 GitHub API: OK 不够——那只是测了元数据接口,不代表 ZIP 包下载也走了认证通道。
用详细日志确认真实行为:
composer install -vvv 2>&1 | grep -E "(Downloading|github.com|api.github.com)"
正确输出应类似:
Downloading https://api.github.com/repos/user/repo/zipball/abc123 Downloading https://codeload.github.com/user/repo/legacy.zip/abc123
- 如果看到
git@github.com、ssh://git@github.com或Cloning into,说明协议未切到 HTTPS - 如果看到
403 API rate limit exceeded,说明 Token 没配对或权限不足(比如漏勾public_repo) - 如果看到
Downloading https://ghproxy.com/https://codeload.github.com/...,说明已叠加代理,HTTPS 路径畅通
容易忽略的权限与路径陷阱
~/.composer/auth.json 权限不对,Token 就是摆设——Composer 会静默跳过该文件,退回到每小时 60 次的匿名限额。
执行完 composer config --global github-oauth.github.com <token></token> 后,立刻补这一步:
chmod 600 ~/.composer/auth.json
Windows 用户注意:%APPDATA%\Composer\auth.json 无法用 chmod,需右键属性 → 安全 → 取消继承 → 仅保留当前用户完全控制。
- Token 必须带
public_repo权限(私有库则需repo),细粒度令牌要额外勾选packages:read和contents:read - 若项目
composer.json中定义了repositories字段(哪怕空对象{}),全局镜像和协议配置可能被绕过 -
composer.lock里固化的是上次解析出的dist.url,改完配置后必须删掉composer.lock和vendor才能刷新协议路径

















