如何刷新GitHub Personal Access Token解决私有仓库下载链接404问题
问题根源
- 点击
<a>标签直接跳转download_url时,浏览器的普通GET请求不会自动携带你在fetch API中配置的Authorization请求头,GitHub私有文件的校验不通过就返回404。 - GitHub返回的
download_url中附带的临时签名token仅对本次API请求的会话有效,直接在浏览器新标签页打开会因会话不匹配失效。 - 你代码中配置的
origin: "Access-Control-Allow-Origin: *"是错误写法,这是服务端返回的响应头,前端请求中添加该参数完全无效。
解决方案
前端本地测试方案(适用于VS Code Live Server环境)
不要直接使用<a>标签的href属性跳转,改为拦截点击事件,手动携带Authorization头请求文件内容,生成临时本地下载链接,修改代码如下:
- 替换原有a标签拼接逻辑:
// 原来拼接<td>Read列的代码替换为: statusHtml += '<td><a href="javascript:void(0)" data-url="' + status.download_url + '" class="download-btn">Click</a></td>';
- 新增下载点击事件监听,放在
get()函数外部即可:
$('tbody').on('click', '.download-btn', function() { const downloadUrl = $(this).data('url'); const fileName = $(this).closest('tr').find('td:eq(1)').text(); const myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer ghp_***********************"); // 替换为你的PAT fetch(downloadUrl, { method: 'GET', headers: myHeaders }) .then(res => res.blob()) .then(blob => { // 生成临时下载链接触发下载 const tempUrl = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = tempUrl; a.download = fileName; document.body.appendChild(a); a.click(); // 清理临时资源 window.URL.revokeObjectURL(tempUrl); document.body.removeChild(a); }) .catch(err => console.log('下载失败:', err)); });
注意事项
- 前端直接写死PAT的方式仅适合本地测试使用,禁止发布到公网环境,PAT泄露会导致你的仓库权限完全对外开放,存在资产被盗风险。如果需要上线使用,必须新增后端代理层,由后端携带PAT请求GitHub接口再将内容返回给前端。
内容的提问来源于stack exchange,提问作者Marko Dunovic
相关产品推荐
相关产品推荐

