如何在JS文件中隐藏PAT以部署至GitHub Pages?
解决纯前端调用GitHub API时PAT暴露的问题
核心问题本质
GitHub会自动扫描公开代码中的PAT并立即吊销,这是平台的安全防护机制。纯前端代码无法安全存储敏感凭证,因为所有前端资源都会被用户的浏览器解析,任何硬编码的密钥都会被直接暴露。
可行解决方案
1. 改用GitHub API匿名访问(限公开资源)
如果你的需求只是获取公开仓库、公开Gist等无需认证的资源,直接使用匿名请求即可。GitHub对匿名请求的速率限制是60次/小时,足够小型应用使用。
示例代码:
// 获取指定公开仓库信息 fetch('https://api.github.com/repos/octocat/Hello-World') .then(res => res.json()) .then(data => console.log(data));
2. 搭建后端代理服务(推荐)
将认证逻辑转移到后端,前端通过调用自己的后端接口间接访问GitHub API,PAT存储在后端的环境变量中,不会暴露给前端用户。
可以选择轻量化的无服务器方案,比如Vercel Edge Functions、Netlify Functions,无需搭建完整的服务器:
示例:Vercel Edge Function代理
- 在项目根目录创建
api/proxy.js文件:
export default async function handler(request) { // 提取要转发的GitHub API路径 const targetUrl = request.url.replace(`${request.nextUrl.origin}/api/proxy`, 'https://api.github.com'); // 带着PAT请求GitHub API const githubResponse = await fetch(targetUrl, { headers: { Authorization: `token ${process.env.GITHUB_PAT}`, Accept: 'application/vnd.github.v3+json' } }); // 将响应返回给前端 return new Response(githubResponse.body, { status: githubResponse.status, headers: githubResponse.headers }); }
- 在Vercel后台设置环境变量
GITHUB_PAT,值为你的个人访问令牌。 - 前端调用代理接口:
// 通过代理获取仓库信息 fetch('/api/proxy/repos/octocat/Hello-World') .then(res => res.json()) .then(data => console.log(data));
3. 使用GitHub OAuth授权(用户专属权限)
如果需要访问用户个人的GitHub资源(比如用户自己的仓库、Gist),可以采用OAuth授权流程,让用户自己授权你的应用,获取临时的访问令牌:
- 注册GitHub OAuth应用,获取
Client ID和Client Secret(后者需存在后端)。 - 前端引导用户跳转到GitHub授权页面,用户授权后,GitHub会返回一个
code。 - 前端将
code发送到你的后端,后端用Client ID、Client Secret和code换取用户的access token。 - 前端使用这个用户专属的access token调用GitHub API,无需暴露你的PAT。
关键提醒
绝对不要尝试在前端代码中存储或传递PAT,无论通过何种加密或混淆手段——浏览器的开发者工具可以轻松获取所有前端资源,GitHub的扫描机制也会快速识别并吊销暴露的令牌。
内容的提问来源于stack exchange,提问作者Divs 4799
相关产品推荐
相关产品推荐

