node.js - 通过 Node.js 提供私有 GitHub 发布下载
问题描述
我一直在尝试为客户提供从私人网站下载私人版本的能力。
使用 Node.JS,我可以使用我的个人访问令牌来请求所有发布,重要的是其中的所有资产。下载 URL 运行良好,但仍需要用户登录 Github.com 才能访问该文件。
在我的 Node API 上发出请求,然后将其提供给前端(以隐藏个人访问令牌。)
const {data} = await axios.get("https://api.github.com/repos/<company>/<repo>/releases", {
auth: {
username: 'LukeXF',
password: '<key>'
}
})
所以,我要么:
- 尝试使用短期令牌直接从 GitHub URL 下载文件,
- 尝试通过我的节点 API 加载文件,然后从节点 API 快速端点下载(我的 API 对用户进行身份验证,没有问题);或者,
- 运行一个脚本,当一个版本发布时,该版本的资产也会上传到 GCP(谷歌云平台)
到目前为止的结果:
我似乎无法获得支持内联身份验证的 GitHub URL,例如
https://github.com/<company>/<repo>/releases/download/${asset}?accessToken=<key>
,我并不希望它能够正常工作,而且也是一个暴露令牌的安全漏洞。使用 Node API 作为中间人,我已经让它部分工作,但似乎无法让编码或用户代理正常工作,或者身份验证存在问题(这很奇怪,因为第一次请求JSON 文件可以正常工作)。
const fullUrl = `https://github.com/<company>/<repo>/releases/download/${asset}`;
const {data} = await axios.get(fullUrl, {
headers: {
'Accept': 'application/octet-stream',
// 'User-Agent': 'request module',
},
// encoding: null,
auth: {
username: 'LukeXF',
password: '<key>'
// token: '<key>'
}
});
- 如果可能的话,最好尽量避免这种情况,因为它会复制我的版本。在运行脚本将它们上传到 GCP 之前,我会查看发布触发器或 CRON 作业以检查新版本。
关于通过 Node.js 从 GitHub 下载私有发布资产的任何指导?我知道如果回购/发布是公开的,那么这不会是一个问题,但它不能公开。也许我可能需要在另一个平台上托管我的存储库,我已经使用 Electron 的自动更新程序和私有 GitHub 版本,我只需要手动下载版本而不是自动下载。
解决方案
如果您使用的是个人令牌,则可以使用Authorization
http 标头使用 api 进行身份验证,请参见:
const axios = require("axios");
const key = "YOUR_TOKEN";
(async () => {
//get releases
const { data } = await axios.get(
"https://api.github.com/repos/OWNER/REPO/releases",
{
headers: {
Authorization: `Token ${key}`,
},
}
);
console.log(data);
})();
以下脚本将从最新版本下载所有资产并将这些资产保存到本地文件:
const axios = require("axios");
const fs = require("fs");
const key = "YOUR_TOKEN";
const authHeaders = {
Authorization: `Token ${key}`,
};
const repoWithOwner = "bertrandmartel/test-repo";
(async () => {
//get latest release
var response = await axios.get(
`https://api.github.com/repos/${repoWithOwner}/releases/latest`,
{
headers: authHeaders,
}
);
var assets = response.data.assets;
for (var i = 0; i < assets.length; i++) {
console.log(assets[i].url);
response = await axios({
method: "get",
url: assets[i].url,
responseType: "stream",
headers: {
Accept: "application/octet-stream",
...authHeaders,
},
});
response.data.pipe(fs.createWriteStream(assets[i].name)); //write asset to file
}
})();
推荐阅读
- jquery - 根据 Ajax 返回的结果更改列背景颜色
- kubernetes - 等待 Kubernetes 作业完成
- c# - c# 获取属性类型是否继承自一个带有反射的抽象泛型类
- php - 带有 JSON_UNESCAPED_UNICODE 的 json_encode 不会去掉 \u0007 字符
- angular - AppModule 中导入的模块在不同模块中不可见
- c# - 如何移动不可见的应用程序
- python - 使用多个模块进行记录时的记录器层次结构和根记录器
- clojure - HugSQL 查询中的嵌套命名空间键
- c++ - 如何转换图像:cv_32FC1 到 cv_16UC1
- python - TensorFlow Probability、Edward2 和 Python 上的离散贝叶斯网络