私有仓库鉴权必须严格匹配后端类型:gitlab用gitlab-token,bitbucket用http-basic配app password,satis/artifactory等统一用http-basic;域名须完全一致,否则401或静默失败。

私有仓库鉴权不是“选一个就行”,而是必须按后端类型匹配——用错认证方式,composer install 会静默跳过凭据,直接报 401 或 Could not find package。
GitLab 私有包必须用 gitlab-token,不是 http-basic
GitLab API 认证走的是专用 token 字段,写成 http-basic 格式会被完全忽略。Composer 查到 gitlab.example.com 域名时,只认 "gitlab-token" 键名。
- 正确写法(项目根目录
auth.json):{ "gitlab.example.com": { "gitlab-token": "glpat-xxxxxxxxxxxxxxxxxxxx" } } - 错误写法:
{"http-basic": {"gitlab.example.com": {...}}}—— 这个配置对 GitLab 无效 - Token 必须在 GitLab 设置页生成,权限至少含
read_api和read_repository - Linux/macOS 下记得运行
chmod 600 auth.json,否则 Composer 直接跳过读取
Bitbucket 私有仓库只能用 http-basic,且用户名密码是 App Password
Bitbucket 已停用账号密码直连 API,必须用 App Password,并严格按 http-basic 结构嵌套。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确结构(注意双层嵌套):
{ "http-basic": { "bitbucket.org": { "username": "your-username", "password": "app-password-generated-in-bitbucket" } } } - URL 必须以
.git结尾,且repositories中type必须为vcs,否则 Composer 不触发克隆逻辑 - 别把
consumer-key当成有效字段——那是旧版 OAuth 的遗留字段,当前版本不识别 - App Password 权限必须勾选
account:read和repository:read,缺一不可
Satis / Artifactory / 自建 Composer 仓库统一用 http-basic
这类服务暴露的是标准 Composer HTTP 协议接口,认证走通用 Basic 流程,和 Git 平台无关。
- 凭证写法一致:
{ "http-basic": { "repo.example.com": { "username": "api", "password": "token123" } } } - Artifactory 上必须创建 Package Type 为
composer的仓库,Generic 类型不兼容 - Satis 构建后需确保
packages.json可被curl -I https://satis.example.com/packages.json直接返回 200;Nginx 返回 403 就会 fallback 到 packagist.org - URL 末尾斜杠不能省:
"https://satis.example.com/"✅,"https://satis.example.com"❌(404)
CI/CD 环境必须用 COMPOSER_AUTH 环境变量,且格式零容忍
CI 中写错一个逗号、多一个换行、键名大小写不对,composer install 就会静默失败,日志里只显示“Authentication required”。
- 必须是单行 JSON,无缩进无换行:
COMPOSER_AUTH='{"http-basic":{"repo.example.com":{"username":"ci","password":"xxx"}}}' - 禁止用 shell 变量拼接,要用
jq生成:echo '{"http-basic": {"'"$REPO_HOST"'": {"username": "'"$CI_USER"'", "password": "'"$CI_TOKEN"'"}}}' | jq -c - 流水线第一步加校验:
composer config --global --list | grep -q "http-basic",不命中就退出 - 不要在脚本里 echo $COMPOSER_AUTH —— 日志可能泄露凭证
最常被忽略的一点:所有认证方式都依赖 repositories 中对应源的 url 域名与 auth.json 或 COMPOSER_AUTH 中的域名**完全一致**,包括端口和子域;packages.internal 和 www.packages.internal 被视为两个不同源,凭据不会复用。










