簡體   English   中英

通過 Node.js 提供私有 GitHub 發布下載

[英]Serve private GitHub release downloads through Node.js

我一直在努力使從私人網站為客戶下載私人版本的能力。

使用 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>'
    }
})

所以,我要么:

  1. 嘗試使用短期令牌直接從 GitHub URL 下載文件,
  2. 嘗試通過我的節點 API 加載文件,然后從節點 API 快速端點下載(我的 API 對用戶進行了身份驗證,沒有問題); 要么,
  3. 運行一個腳本,當發布發布時,發布的資產也上傳到 GCP(谷歌雲平台)

到目前為止的結果:

  1. 我似乎無法獲得支持內聯身份驗證的 GitHub URL,例如https://github.com/<company>/<repo>/releases/download/${asset}?accessToken=<key> ,我沒有無論如何都不希望工作,而且也是一個暴露令牌的安全漏洞。

  2. 使用 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>'
    }
});
  1. 理想情況下,如果可能的話,盡量避免這種情況,因為它會重復我的版本。 在運行腳本將它們上傳到 GCP 之前,我會查看發布觸發器或 CRON 作業來檢查新版本。

關於通過 Node.js 從 GitHub 下載私有發布資產的任何指導? 我知道如果 repo/releases 是公開的,那么這不會是一個問題,但它不能公開。 也許我可能需要在另一個平台上托管我的存儲庫,我已經在使用 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
  }
})();

此外,還有用於 JS 的 octokit github 客戶端

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM