Composer下次仍弹登录是因为未使用--global参数,OAuth token仅限当前项目生效;永久生效需用composer config --global github-oauth.github.com <token>,且token须含repo权限。

composer config github-oauth.github.com 后为什么下次还弹登录?
因为 composer config 写入的是当前项目的 composer.json,不是全局配置。除非你明确加 --global,否则 OAuth token 只对当前目录生效,CI 或新项目里照样要输密码。
- 永久生效必须用
composer config --global github-oauth.github.com <token> - token 必须是 GitHub Personal Access Token,且至少带
reposcope(public_repo不够,私有库会失败) - 旧版 Composer(github-oauth 全局写入,会静默忽略——检查版本:
composer --version,低于 2.0 的先升级
GitHub Token 怎么生成才不踩权限坑?
选错 scope 是最常见失败原因:Composer 安装私有包、fork 后的依赖、甚至某些 public 包的子模块拉取,都可能触发 repo 权限校验。只开 public_repo 看似安全,实际多数场景会报 404 Not Found 或 403 Forbidden。
- 进入 GitHub Tokens 页面,勾选
repo(全选 repo 下子项),别省事 - Token 名建议带用途,比如
composer-global-2024,方便后续回收 - 生成后立刻复制——页面关闭就再也看不到了;粘贴进命令时别带空格或换行
CI/CD 里自动配置的可靠写法
在 GitHub Actions、GitLab CI 等环境里,不能交互输 token,必须靠环境变量注入。但直接 composer config --global 会把 token 明文写进 ~/.composer/auth.json,有泄露风险。
- 推荐用
COMPOSER_AUTH环境变量替代文件写入:echo '{"github-oauth":{"github.com":"$GITHUB_TOKEN"}}' > ~/.composer/auth.json - 更安全的做法是运行时注入:
COMPOSER_AUTH='{"github-oauth":{"github.com":"'$GITHUB_TOKEN'"}}' composer install - 注意单双引号嵌套:Shell 里变量要能在 JSON 字符串里展开,
'$GITHUB_TOKEN'外层必须是双引号,或用"$(printf %q "$GITHUB_TOKEN")"转义特殊字符
auth.json 权限和路径冲突问题
~/.composer/auth.json 如果被设成 root 所有或 777 权限,Composer 会拒绝读取并报错 Could not authenticate against github.com,连 token 对不对都来不及验证。
- 确保文件属主是你当前运行 composer 的用户:
chown $USER:$USER ~/.composer/auth.json - 权限必须是 600:
chmod 600 ~/.composer/auth.json - 如果同时存在项目级
composer.json里的config.github-oauth和全局auth.json,优先级是:项目配置 > 全局 auth.json > 环境变量 —— 调试时先grep -r github-oauth vendor/ composer.json确认没硬编码
真正麻烦的不是配一次,而是 token 过期、权限变、路径被覆盖这三件事经常凑一块儿发生。每次 CI 报 403,先看 cat ~/.composer/auth.json 是否可读,再检查 ls -l ~/.composer/auth.json 的权限和属主——比重跑整个流程快得多。










