github-oauth 是访问 GitHub 私有库及绕过限频的必要凭证通道,必须通过 composer config -g github-oauth.github.com 写入全局 auth.json,域名须为 github.com,字段名严格为 github-oauth,Token 需含 repo 权限。

github-oauth 是 Composer 用来向 GitHub API 发起带身份认证请求的配置项,不是可选功能,而是当前(2026 年)访问 GitHub 私有库、绕过限频、甚至拉取部分公开包元数据的**必要凭证通道**。不配或配错,composer install 和 composer update 就会卡在“Could not fetch”“401 Unauthorized”或伪装成 404 的 403 错误上。
为什么 github-oauth 必须写进全局配置
GitHub API 的元数据请求(比如解析依赖树、查 composer.json、读 tag 列表)发生在安装前的全局解析阶段——此时项目目录下的 auth.json 还没被加载,composer.json 里的 config.github-oauth 字段也完全不参与这个流程。
-
composer config -g github-oauth.github.com <token></token>才会写入全局~/.composer/auth.json,覆盖整个链路 - 漏掉
-g(或写成--global)会把 token 塞进当前项目的composer.json的config字段,换个项目就失效,还可能误提交到 Git - 手动编辑
~/.composer/auth.json极易因 JSON 格式错误(比如多逗号、引号不匹配)、文件权限不对(不是600)、属主不是当前用户而静默失败
github-oauth 的域名和字段名不能错
Composer 对字段名和 host 名大小写敏感、嵌套层级固定,写错任何一处都不报明确错误,只会返回模糊的 Could not fetch 或伪装成 404 的 401。
生成周报:读取本机 Git 仓库最近一周的提交记录,按项目分类提炼总结,生成标准周报格式,通过微信推送并返回给用户。触发词:周报、weekly report、git总结、提交记录总结、工作周报。
- 域名必须是
github.com—— 不是api.github.com、www.github.com,也不是带端口的地址 - 字段名必须是
github-oauth(中间是短横线),不是github_oauth、githubAuth或github-o-auth - GitHub Enterprise 用户需换成对应实例域名,如
git.example.com,但字段名仍是github-oauth
Token 权限不够比没配更难排查
遇到 Could not authenticate against github.com 或 Failed to download,第一反应不该是“token 过期”,而应检查权限是否足够。GitHub 已停用密码和 OAuth App 认证,现在只接受 Personal Access Token(PAT),且必须勾选 repo(含 public_repo 和 private_repo)。
- 仅勾
public_repo看似安全,但 Composer 拉取 fork 后的依赖、子模块、甚至某些 Packagist 上的公开包时,仍会触发repo权限校验,结果报 404 或 403 -
read:packages仅当你使用 GitHub Packages(如私有包托管在ghcr.io)时才需要;delete:packages和admin:org完全没必要,Composer 从不 push 或删包 - 别用 fine-grained token —— 当前主流 Composer 版本对其支持不稳定;优先选 classic token,在
Settings → Developer settings → Personal access tokens → Tokens (classic)创建
CI/CD 中别硬写 auth.json 文件
直接把 token 写进 auth.json 再挂载到容器,容易在日志、镜像层或调试输出中泄露。更安全的做法是运行时注入 COMPOSER_AUTH 环境变量。
- 格式必须是合法 JSON 字符串:
{"github-oauth":{"github.com":"ghp_xxx"}} - Shell 中要正确转义双引号:
export COMPOSER_AUTH="{\"github-oauth\":{\"github.com\":\"$GITHUB_TOKEN\"}}" -
COMPOSER_AUTH优先级高于auth.json,但若项目根目录存在auth.json,它会被跳过——CI 中务必确保该文件不存在或已重命名 - 验证方式:运行
composer config -g github-oauth.github.com,输出应为几个星号(如***),长度合理(通常 40 位);空输出或报错说明写入失败或格式异常
最常被忽略的是:即使全局配了 github-oauth,如果项目 composer.json 里没声明正确的 VCS 源(比如私有库没加 "type": "vcs"),或者组织启用了 SSO 却没去 Settings → Applications → Authorized OAuth Apps 页面手动 approve 该 token,照样会失败。

















