GitHub PAT失效需检查token状态、权限及配置:确保token未过期/撤销且含repo权限;配置域名必须为全小写github.com;HTTPS仓库URL才生效OAuth;清除Composer缓存并验证请求头。

GitHub Personal Access Token(PAT)已失效
Composer 报 token 过期,本质是 GitHub 拒绝了当前 PAT 的访问请求——不是 Composer 缓存了旧 token,而是该 token 已被手动撤销、过期、或权限不足。错误通常表现为:Could not fetch https://api.github.com/... 401 Unauthorized 或 Failed to download ... github.com: invalid credentials。
- 登录 GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic),检查对应 token 是否仍存在、未过期、且勾选了
repo权限(read:packages和delete:packages仅用于 GitHub Packages,私有仓库只需repo) - 如果 token 已被 revoke 或过期,必须生成新 token 并重新配置,旧 token 无法“续期”
- 确认你配置的是
github.com域名,不是api.github.com或其他变体:运行composer config -g github-oauth.github.com查看当前值,输出应为一串 40 位以上字母数字组合
composer config 写入的 token 未生效
即使新 token 正确生成,Composer 也可能没读到它——常见于配置层级冲突或拼写错误。
- 检查是否误配成
github-oauth.api.github.com(错)或github-oauth.GitHub.com(大小写敏感,错),正确域名必须全小写:github.com - 项目级
composer.json中的config段若含github-oauth,会覆盖全局配置;运行composer config github-oauth.github.com(不带-g)确认项目级是否干扰 - 某些 CI 环境(如 GitHub Actions)不读全局 config,必须在 workflow 中显式执行
composer config -g github-oauth.github.com ${{ secrets.GITHUB_TOKEN }}
私有仓库 URL 格式不匹配认证机制
Token 只对 HTTPS 协议生效;若 composer.json 里私有仓库 URL 是 SSH 格式(git@github.com:user/repo.git),Composer 根本不会尝试用 GitHub OAuth,自然报 404 或 permission denied。
- 确保
repositories中 URL 使用 HTTPS:例如"url": "https://github.com/user/private-repo.git",且"type": "vcs" - 不要混用:SSH URL + GitHub OAuth 配置 = 无效;HTTPS URL + 无 OAuth 配置 = 401
- 验证方式:用
curl -H "Authorization: token YOUR_NEW_TOKEN" https://api.github.com/repos/user/private-repo能返回 JSON,说明 token 和权限没问题
缓存残留导致 token 未刷新
Composer 会缓存包元数据(如 packages.json),若之前用旧 token 请求失败并缓存了 401 响应,后续即使换新 token,仍可能复用错误缓存。
- 强制清除所有相关缓存:
composer clear-cache,不只是vendor/或composer.lock - 临时禁用缓存验证一次:
COMPOSER_CACHE_DIR=/tmp/composer-tmp composer install -vvv,排除缓存干扰 - 若使用 GitHub Packages(
ghcr.io),还需单独清理其缓存:composer clear-cache --no-plugins防插件干扰
composer config -g github-oauth.github.com 和 composer install -vvv 对照看实际请求头,比反复重试更省时间。


















