换Token后仍401是因为Composer机械读取auth.json并发送旧Authorization头;必须用composer config命令覆盖更新,确保域名完全匹配、权限为600且无环境变量冲突。

不是重配 Token,是重配 auth.json 里对应域名的凭据——Token 失效后,必须用新 Token 覆盖旧配置,否则 Composer 仍会发已过期的 Authorization 头。
为什么换 Token 后还是 401?
Composer 不会自动感知 Token 过期,它只机械地读取 auth.json 并拼 Authorization 头。旧 Token 已失效,但配置没更新,请求照样发出,服务器直接返回 401。
- 运行
composer config --list | grep http-basic(项目级)或composer config --global --list | grep http-basic(全局),确认当前生效的是哪个域名的配置 - 检查报错中出现的 URL 域名(如
packages.internal.company:8443),和auth.json里 key 是否完全一致(端口、子域、大小写都不能差) - 别试图“改密码字段”,直接用
composer config命令重写:它会覆盖旧值,且自动处理 JSON 格式和 base64 编码
怎么用命令行安全替换 Token
手改 auth.json 容易出错(逗号漏了、引号不转义、权限变 644),命令行是唯一推荐方式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目级更新(只影响当前目录):
composer config http-basic.packages.example.com your-user 'new_token_here' - 全局更新(所有项目):
composer config --global http-basic.packages.example.com your-user 'new_token_here' - 密码含
$、!、@等 shell 特殊字符,必须用单引号包裹,否则会被 shell 展开 - 执行后立刻验证:
composer config --global --list | grep -A2 packages.example.com,看输出是否为新值
GitHub/GitLab 的 Token 类型和权限不能混用
不同平台对 Token 类型和 scope 要求严格,填错等于没填。
- GitHub 必须用 classic PAT(不是 fine-grained),且
github-oauth字段只认github.com;Token 至少勾选read:packages - GitLab 必须用 Personal Access Token(不是 Deploy Token),
http-basic中的password字段填的是 token,不是密码;权限需含read_api和read_registry - 若用 GitLab Group Package,仓库 URL 是
https://gitlab.com/groups/mygroup/-/package-registry,auth.json里的域名必须是gitlab.com,不是gitlab.com/groups/mygroup
容易被忽略的三个静默失败点
即使 Token 新、域名对、命令也执行了,仍可能 401——因为 Composer 根本没读到你配的那条。
-
auth.json权限是 644?Linux/macOS 下 Composer 会直接跳过,必须chmod 600 auth.json - 项目根目录有
auth.json,但COMPOSER_AUTH环境变量同时存在?后者优先级更高,会屏蔽文件配置 -
composer.json里repositories的 URL 协议是git@?HTTP Basic 认证只在https://协议下触发,SSH 地址不会读auth.json

















