composer报token过期实为凭据失效或配置未更新,需删旧配置后用composer config --global --auth重写新token,而非刷新;常见原因包括token被revoke、域名错误、权限不足或auth.json格式/权限问题。

Composer 里没有“token 刷新”机制,所谓“token 过期”其实是凭据失效或配置未更新——删掉旧配置、用新 token 重写 auth.json 就行,不需要轮询、续期或调用刷新接口。
为什么 composer install 突然报 401 或 “token has expired”
这不是时间戳校验失败,而是 Composer 仍在发已失效的 Authorization 头。常见原因包括:
- 你在 GitHub/GitLab 后台手动 revoke 了该 token
- token 是 fine-grained 类型(有固定有效期),而 Composer 只支持 classic PAT
-
auth.json里填的是旧密码,但平台已强制启用 token 登录 - 域名写错:比如该配
gitlab.example.com却写了https://gitlab.example.com或gitlab.example.com/api/v4 - 权限不足:GitHub token 缺
read:packages,GitLab token 缺read_api和read_registry
必须用 composer config --auth 覆盖写入
手改 auth.json 容易格式出错(逗号漏、引号不转义、权限变 644),且 shell 历史会记录明文密码。正确做法是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 删旧配置:
composer config --global --unset github-oauth.github.com(或对应域名) - 重写新 token:
composer config --global --auth github-oauth.github.com your_new_token_here - 含特殊字符(如
$、!)时,务必用单引号包裹 token:'your!$token' - 验证是否生效:
composer config --global --list | grep github-oauth,输出应为github-oauth.github.com : abcd123...
GitLab / 私有 Packagist 怎么配 http-basic
这类服务不走 OAuth,而是用用户名 + token 做 Basic Auth,注意三点:
- key 必须精确匹配请求 URL 的 host + port:
http-basic.gitlab.example.com:8443≠http-basic.gitlab.example.com - password 字段填的是 token,不是登录密码:
composer config --global --auth http-basic.gitlab.example.com username 'your_token_here' - GitLab token 必须勾选
read_api和read_registry;若 URL 指向 group package(如https://gitlab.com/groups/mygroup/-/package-registry),key 仍只能是gitlab.com,不能带路径
容易被忽略的静默失败点
即使 token 新、命令执行成功、域名也对,仍可能 401——因为 Composer 根本没读到你配的那条:
-
auth.json权限不是 600(Linux/macOS):运行chmod 600 ~/.composer/auth.json - 项目级配置和全局配置冲突:全局优先级更高,若
~/.composer/auth.json存在且过期,项目里的auth.json不会被读 - 缓存没清:旧的 401 响应可能被元数据层缓存,执行
composer clear-cache再试 - CI 环境中 token 被注入时带了换行或空格:用
echo "$GITHUB_TOKEN" | tr -d '\n\r' | xargs清理后再传入
最常踩的坑是:以为 token 有“自动刷新”逻辑,其实 Composer 完全不感知时效性;它只机械读取配置并拼头。只要配置没更新,哪怕 token 昨天刚失效,它今天照样发出去。










