如何允许公共应用程序在没有访问令牌的情况下连接到 GitHub API v4?

Ren*_*ato 5 security release github-api

我决定尝试在 GitHub 上管理我的一个应用程序的发布,就像使用 GitHub Actions 一样,我可以在 Mac、Linux 和 Windows 上进行构建,并自动将工件推送到 GitHub 发布页面,任何人都可以从该页面下载该应用程序。

但是,我希望我的应用程序能够自我更新,因此应用程序本身还需要能够查询存储库版本中的最新版本,然后下载用户操作系统的相关资产......我认为这将是一个不是问题...但是,如果没有 OAuth 应用程序或个人访问令牌,则无法访问 GitHub API v4。

我不需要 OAuth 应用程序,因为我的应用程序的用户绝对不会是 GitHub 客户。因此,我尝试使用个人访问令牌,其唯一范围是访问公共发布资产(同样,这是任何人都可以手动下载的公共资源)。

由于此令牌无法执行您或其他任何人无法手动执行的任何操作,即使没有 GitHub 帐户,我认为将令牌放在我的应用程序的源代码中就可以了,但是 GitHub 在检测到时会撤销该令牌它在提交上。

有没有好的方法来解决这个问题?我应该将令牌放入 GitHub 秘密中,然后在编译期间尝试用它替换占位符吗?我想避免这种情况,因为这让我很难在本地测试应用程序,而且,它不能解决任何问题,因为任何人都可以轻松反编译应用程序并在那里找到令牌(假设 GitHub 不会检测到秘密存在于编译期间“已处理”的源)。

任何建议,将不胜感激。

Bre*_*ter 1

但是,如果没有 OAuth 应用程序或个人访问令牌,则无法访问 GitHub API v4。

GitHub API v3 确实支持未经身份验证的调用,但每个 IP 地址限制为 60 个请求/小时:https ://developer.github.com/v3/#rate-limiting

对于未经身份验证的请求,速率限制允许每小时最多 60 个请求。未经身份验证的请求与原始 IP 地址相关联,而不是与发出请求的用户相关联。

最新版本 API文档将向您显示返回的信息,但我怀疑您需要对列表资产进行二次调用才能发布进行二次调用,以了解客户端需要下载的文件。

如果这不令人满意(例如,您知道将有许多客户端尝试使用相同的 IP 地址进行更新),并且您想确保它们不受速率限制,请继续阅读其他方法。

有没有好的方法来解决这个问题?

我的解决方法是部署一个小型 Web 服务(例如 Heroku dyno),您的应用程序无需身份验证即可调用该服务,然后执行最新版本的实际查找(使用作为环境变量嵌入的 PAT)并返回客户端可以理解的简单 JSON 响应。

好处:

  • 客户端中没有嵌入令牌
    • 开发模式甚至可以调用同一个服务
  • 向客户端执行的服务添加逻辑以简化您的应用程序
    • 例如打电话/latest/beta/latest/stable表明它正在寻找特定频道
    • 执行两个 API 调用并返回客户端需要的资产
  • 可以在必要时更新服务中的令牌(例如刷新令牌),而无需更改客户端
  • 可以缓存响应以降低速率限制的风险

缺点:

  • 整体架构中需要管理更多移动部件
  • 如果有大量客户端连接,则需要担心服务的正常运行时间
    • 这可以通过使客户端对故障情况具有弹性来抵消