You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:37:32