使用GitHub REST API在外部站点列公开仓库时令牌被删除
解决GitHub API前端请求401及令牌被删除的问题
你遇到的核心问题是把个人访问令牌硬编码在前端JavaScript代码里,上线后用户可通过浏览器开发者工具直接获取你的令牌,一旦有人滥用该令牌(比如高频请求、违规操作仓库),GitHub安全系统会检测到异常并直接撤销令牌,导致请求返回401错误。
另外,你要访问的是自己的公开仓库,这类公开资源其实无需授权就能通过GitHub API获取,这是最直接的解决方案。
解决方案1:直接移除授权头(推荐)
公开仓库列表属于公开资源,GitHub API允许无授权请求直接访问,修改前端代码如下:
async function loadRepositories() { const response = await fetch("https://api.github.com/users/tauromachian/repos"); const repositories = await response.json(); return repositories; }
注意事项
- 无授权请求的限额为每小时60次,若网站访问量不大,该限额完全够用。
- 若后续需要更高请求限额(比如每小时5000次),再考虑后端代理方案。
解决方案2:后端代理令牌(适合高访问量场景)
如果网站访问量较大,需要更高请求限额,绝对不能把令牌放在前端,必须通过后端中转请求:
1. 搭建简单后端(以Node.js/Express为例)
将令牌存放在环境变量中(禁止硬写在代码里),由后端负责请求GitHub API并返回结果:
const express = require('express'); const fetch = require('node-fetch'); const app = express(); const PORT = 3001; // 从环境变量读取令牌,避免硬编码泄露 const GITHUB_TOKEN = process.env.GITHUB_TOKEN; app.get('/api/repos', async (req, res) => { try { const githubResponse = await fetch('https://api.github.com/users/tauromachian/repos', { headers: { Authorization: `Bearer ${GITHUB_TOKEN}` } }); const repos = await githubResponse.json(); res.json(repos); } catch (err) { res.status(500).json({ error: '获取仓库列表失败' }); } }); app.listen(PORT, () => { console.log(`服务运行在端口 ${PORT}`); });
2. 前端修改请求地址
前端不再直接请求GitHub API,改为请求自己的后端接口:
async function loadRepositories() { const response = await fetch("/api/repos"); const repositories = await response.json(); return repositories; }
环境变量设置
启动后端时,通过环境变量传入令牌:
GITHUB_TOKEN=your_actual_token node server.js
后续注意事项
- 永远不要把个人访问令牌暴露在前端代码、提交到代码仓库中。
- 若令牌已被撤销,前往GitHub的设置 -> 开发者设置 -> 个人访问令牌页面重新生成,且只给令牌分配必要权限(比如仅
public_repo权限)。
内容的提问来源于stack exchange,提问作者jogarcia
相关产品推荐
相关产品推荐

