GitHub PAT调用API返回401但CLI正常:差异原因探究
问题概述
所有个人访问令牌(Personal Access Token,PAT)在使用curl或直接API调用时均返回401 Bad credentials错误,但GitHub CLI认证完全正常。该问题影响包括新创建令牌在内的所有令牌。
环境信息
- 操作系统:WSL2(Ubuntu 24.04.2 LTS)+ Windows PowerShell
- 账号类型:个人GitHub账号(非组织账号)
- 问题起始时间:在WSL中大量使用Claude Code之后
- 测试环境:通过移动热点在多个IP地址测试
有效与无效场景对比
✅ 正常可用 - GitHub CLI
gh auth login # 浏览器认证成功 gh auth status # 显示已认证状态 gh api user # 成功返回用户数据
❌ 认证失败 - 使用相同令牌的直接API调用
# 从正常工作的GitHub CLI中获取令牌 TOKEN=$(gh auth token) echo $TOKEN # 显示有效令牌:gho_xxxxxxxxxxxx # 相同令牌在curl中认证失败 curl -H "Authorization: token $TOKEN" https://api.github.com/user # 返回结果:{"message": "Bad credentials", "status": "401"} # 使用Bearer格式同样失败 curl -H "Authorization: Bearer $TOKEN" https://api.github.com/user # 返回结果:{"message": "Bad credentials", "status": "401"}
已完成的全面测试
✅ 多令牌创建测试
- 创建了5+个拥有完整权限(
repo、workflow、user、admin:repo_hook)的新令牌 - 涵盖经典令牌与细粒度令牌
- 所有令牌均立即触发401错误
✅ 环境测试
- 在WSL与Windows PowerShell中均测试过 - 错误一致
- 在不同IP地址(移动热点)测试 - 错误一致
- 未配置代理设置
✅ 账号验证
gh api user/orgs # 返回[](无组织) gh config get host # 返回空值(默认GitHub.com) gh api user # 成功返回完整用户信息
✅ 认证请求头测试
# 以下方式均返回相同的401错误: curl -H "Authorization: token TOKEN" https://api.github.com/user curl -H "Authorization: Bearer TOKEN" https://api.github.com/user curl -u "username:TOKEN" https://api.github.com/user
核心疑问
为何使用完全相同的令牌,GitHub CLI可正常认证但直接API调用却失败?
- GitHub CLI使用相同的REST API端点
- 令牌拥有所有必要权限
- 无组织/企业级限制
- 无IP限制(已在多个网络测试)
具体问题
- GitHub CLI使用的认证机制与直接使用PAT有何不同?
- 是否存在影响PAT使用但不影响CLI的隐藏账号级限制?
- curl是否缺失了特定的请求头或User-Agent要求?
补充背景
问题始于大量使用Claude Code(Anthropic的工具)之后,该工具频繁因认证问题离线。多次认证失败是否触发了账号级别的PAT限制?
非常欢迎关于GitHub CLI与直接PAT认证的内部差异的任何见解!
针对评论的更新
具体问题:curl认证返回401 "Bad credentials"错误,但GitHub CLI使用相同凭证可成功认证
复现步骤:
- 创建拥有repo权限的PAT
- 使用curl测试:
curl -H "Authorization: token XXX" https://api.github.com/user→ 返回401 - 使用gh CLI测试:
gh api user→ 成功
环境详情:
- WSL2 Ubuntu 24.04.2 LTS
- curl 7.81.0
- GitHub CLI 2.40.1
- 已在多个IP地址测试
核心问题:curl与GitHub CLI的认证方式差异由何导致?
内容的提问来源于stack exchange,提问作者Rebuild Factoryz
相关产品推荐
相关产品推荐

