如何在浏览器中用GitHub App获取私有仓库代码?认证失败求助
GitHub App 401 认证失败排查求助
我已完成以下操作:
- 创建GitHub App
- 配置Webhook
- 通过Python生成JWT
随后在浏览器中运行以下测试代码请求私有仓库代码:
<script data-description="Github-App"> function testJWT() { return new Promise((resolve) => { const xhr = new XMLHttpRequest(); xhr.timeout = 5000; xhr.open( "GET", PR.head.repo.blobs_url.replace("{/sha}", `/${PR.head.sha}`) ); xhr.setRequestHeader("Accept", "application/vnd.github+json"); xhr.setRequestHeader("Authorization", `Bearer ${JWT}`); xhr.setRequestHeader("X-GitHub-Api-Version", `2024-11-26`); xhr.onreadystatechange = () => { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { console.log(xhr.response); } else { console.error(xhr.response); alert("fail!"); resolve(); } } }; xhr.send(); }); } testJWT(); </script>
请求失败,返回错误信息:
{ "message": "Bad credentials", "documentation_url": "https://docs.github.com/rest", "status": "401" }
我还尝试了octokit-App、octokit-Octokit、octokit-createAppAuth、OAuth2 key/secret等方式,均出现401认证失败,求排查方向。
排查建议
JWT 有效性验证
- 检查生成JWT时的App ID和私钥是否完全匹配,私钥需保持原始格式(包含
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----及中间的换行) - 确认JWT有效期不超过10分钟,过期需重新生成;可本地解码JWT查看
iat(签发时间)、exp(过期时间)、iss(App ID)是否合法
- 检查生成JWT时的App ID和私钥是否完全匹配,私钥需保持原始格式(包含
权限与安装配置
- 确认GitHub App已开启仓库内容读取权限,并已安装到目标私有仓库所在的账号/组织,且安装时选中了该私有仓库
认证流程修正
- GitHub App的JWT不能直接调用仓库接口,正确流程是:
- 用JWT请求
GET /app/installations获取对应安装的ID - 用安装ID请求
POST /app/installations/{installation_id}/access_tokens获取安装访问令牌 - 使用安装访问令牌(格式
Bearer {access_token})发起仓库接口请求
- 用JWT请求
- GitHub App的JWT不能直接调用仓库接口,正确流程是:
环境与请求检查
- 浏览器环境存在跨域限制,建议将认证逻辑放在后端(如Python服务)中完成,再由后端转发请求
- 验证请求URL是否正确,替换后的
blobs_url需符合GitHub API格式:https://api.github.com/repos/{owner}/{repo}/git/blobs/{sha}
内容的提问来源于stack exchange,提问作者宋万盛
相关产品推荐
相关产品推荐

