如何使用 GitHub REST API 通过我的个人访问令牌访问组织拥有的私有存储库中的文件数据?

Posted

技术标签:

【中文标题】如何使用 GitHub REST API 通过我的个人访问令牌访问组织拥有的私有存储库中的文件数据?【英文标题】:How can I use the GitHub REST API to access a file's data in a private repository owned by an organization via my personal access token? 【发布时间】:2021-12-29 17:28:45 【问题描述】:

问题

我负责尝试从我公司组织的私有存储库中的文件中检索 json 数据。我是该组织的所有者,但在使用从我的 GitHub 帐户生成的个人访问令牌时不断收到 404401 错误。

为什么我不能使用 OAuth
此节点应用程序将用作存储库中 GH Actions 的一部分,并且用户将无法在每次推送到存储库时登录以验证访问权限。因此,我为什么要寻找使用某种访问令牌的解决方案。

我尝试过的事情:

查看其他 *** 问题,所有这些问题要么不相关、不起作用、未回答或已过时。 Accessing private repositories in organizations on Github Enterprise via REST(最接近我的问题,没有解决方案) 我尝试启用访问令牌的所有权限。 (其余的都是在启用所有权限的情况下完成的) 在 raw.githubusercontent.com 和 api.github.com 之间切换,每次添加和删除 Accept 标头的 .raw 部分。 使用带有和不带有 Accept 标头的每个 URL。 在每个 URL 中使用 Authorization: "token TOKEN"Authorization: "Bearer TOKEN"。 使用我自己帐户中的存储库,这与我生成的访问令牌非常有效。

我目前正在使用的代码

https
  .get(
    // "https://raw.githubusercontent.com/ORG_NAME/REPO_NAME/main/path/data.json", // results in 404 error
    "https://api.github.com/repos/ORG_NAME/REPO_NAME/contents/path/data.json", // results in 403 error
    
      headers: 
        // request the v3 version of the api
        Accept: "application/vnd.github.v3.raw+json",
        "Content-Type": "application/json;charset=UTF-8",
        Authorization: `token $process.env.GH_TOKEN`,
      ,
    ,
    res => 
    const statusCode = res.statusCode;
    const contentType = res.headers["content-type"] || "";

    let error;
    if (statusCode !== 200) 
       error = new Error(
         "Request Failed.\n" +
           `Status Code: $statusCode: $res.statusMessage`
        );
     else if (!/^application\/json/.test(contentType)) 
      error = new Error(
        "Invalid content-type.\n" +
          `Expected application/json but received $contentType`
      );
    
    if (error) 
      console.log(error.message);
      // consume response data to free up memory
      res.resume();
      return;
    

    res.setEncoding("utf8");
    let rawData = "";
    res.on("data", chunk => (rawData += chunk));
    res.on("end", () => 
      try 
        const parsedData = JSON.parse(rawData);
        console.log(parsedData);
       catch (e) 
        if (e instanceof Error) console.log(e.message);
      
    );
  )
.on("error", e => 
  console.log(`Got error: $e.message`);
);

有点“工作”但不是理想的解决方案

有效的是使用这个 URL:https://raw.githubusercontent.com/ORG_NAME/REPO_NAME/main/path/data.json?token=SOME_RANDOM_GENERATED_TOKEN,并在点击 repo 页面上的 Raw 按钮后添加生成的令牌。我显然不想将此令牌用于生产操作。

我怎样才能让它工作?这个时候还有可能吗?

【问题讨论】:

这是企业云还是服务器?您要访问的存储库是私有的还是内部的?您可以使用文档中的 curl 命令尝试相同的操作吗? docs.github.com/en/enterprise-cloud@latest/rest/reference/…(请注意,我指的是企业云文档)。这将有助于使您的复制器更小。 它当前是服务器,但正在移动到企业帐户。我不确定您所说的内部是什么意思,但它是直接在组织内部创建的私有存储库。我会查看那些文档。 如果它是服务器(即在本地托管),您将无法在主机 api.github.com 上查询它 【参考方案1】:

我尝试了以下请求并且它有效。

GET 'https://raw.githubusercontent.com/ORG_NAME/REPO_NAME/main/README.md' \
 Authorization:'token <Personal Access Token>'

问题可能出在请求 URL 中 - 看起来您在请求 URL 中包含 /path/,这不是必需的。您需要提供文件的实际路径,因此正确的 URL 将是

https://raw.githubusercontent.com/ORG_NAME/REPO_NAME/main/data.json

【讨论】:

我对你的意思有点困惑,我不需要路径,我需要访问一些不在存储库根目录中,而是在子目录中的文件。 @Akados - 好的。没错.. 我希望您指定实际的子目录详细信息而不是 "path/" 。您能否为我做 2 次测试并分享结果 - 1)在邮递员或任何其他客户端进行测试? 2)使用任何根目录文件进行测试,例如。 readme.md 理想情况下这应该有效,因为它对我有用 是的,我没有专门使用“/path/”。我在 curl 中进行了测试,并使用我的个人访问令牌在目录中取回了我需要的数据。在 Node 中进行了测试,结果发现我的令牌没有从我的环境中加载。用键替换变量非常适合您的答案。 @Akados 好消息.. 终于你发现了真正的罪魁祸首..

以上是关于如何使用 GitHub REST API 通过我的个人访问令牌访问组织拥有的私有存储库中的文件数据?的主要内容,如果未能解决你的问题,请参考以下文章

从 REST API GitHub 检索大量数据

如何通过 HTTP REST API 访问我的 Firebase 数据库?

通过我的 REST API 和 Facebook 进行用户身份验证

如何在 C# 中使用 rest api 从 github 为用户(人)获取数据?

如何下载Paypal rest api SDK jar

如何通过查询身份验证保护 REST API