换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),命令行是唯一推荐方式。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 项目级更新(只影响当前目录):
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










