我决定尝试在GitHub上管理我的一个应用程序的发布,因为使用GitHub Actions,我可以在Mac、Linux和Windows上构建,并自动将工件推送到GitHub Release页面,任何人都可以从那里下载应用程序。
然而,我希望我的应用程序能够自我更新,因此应用程序本身也需要能够查询回购版本中的最新版本,然后下载用户操作系统的相关资产。。。我认为这不是问题。。。然而,如果没有OAuth应用程序或个人访问令牌,就无法访问GitHub API v4。
我不想要OAuth应用程序,因为我的应用程序的用户绝对不应该是GitHub的客户。因此,我尝试使用一个个人访问令牌,其唯一作用域是访问公共发布资产(这也是一个任何人都可以手动下载的公共资源(。
由于这个令牌不能做任何你或任何其他人手动不能做的事情,即使没有GitHub帐户,我认为将令牌放在我的应用程序的源代码中也可以,但GitHub在提交时检测到令牌时会撤销它。
有什么好办法解决这个问题吗?我应该把令牌放在GitHub机密中,然后在编译过程中尝试用它替换占位符吗??我想避免这种情况,因为这让我很难在本地测试该应用程序,而且它也不能解决任何问题,因为任何人都可以轻松地反编译该应用程序并在那里找到令牌(假设GitHub在编译过程中不会检测到"已处理"源中存在秘密(。
如有任何建议,我们将不胜感激。
但是,如果没有OAuth应用程序或个人访问令牌,就无法访问GitHub API v4。
GitHub API v3确实支持未经验证的调用,但每个IP地址每小时限制为60个请求:https://developer.github.com/v3/#rate-限制
对于未经身份验证的请求,速率限制允许每小时最多60个请求。未经身份验证的请求与发起IP地址相关联,而不是与发出请求的用户相关联
最新发布的API文档将向您显示返回的信息,但我怀疑您需要对发布的List Assets进行二次调用,以了解客户端需要下载的文件。
如果这不令人满意(例如,你知道你会有很多客户端尝试使用相同的IP地址进行更新(,并且你想确保它们不受速率限制,请继续阅读不同的方法。
有什么好方法可以解决这个问题吗?
我将如何解决这一问题,方法是部署一个小型web服务(例如Heroku dyno(,您的应用程序可以在不需要身份验证的情况下调用该服务,然后执行最新版本的实际查找(使用嵌入为环境变量的PAT(,并返回一个客户端能够理解的简单JSON响应。
优点:
- 客户端中未嵌入令牌
- 开发模式甚至可以调用相同的服务
- 为客户端执行的服务添加逻辑以简化您的应用程序
- 例如,调用
/latest/beta
或/latest/stable
以指示它正在查找特定频道 - 执行API调用并返回客户端需要的资产
- 例如,调用
- 可以在不更改客户端的情况下随时更新服务中的令牌(例如刷新令牌(
- 可以缓存响应以降低速率受限的风险
缺点:
- 在您的整体架构中需要管理的更多移动部件
- 如果有很多客户端连接,则需要担心服务的正常运行时间
- 这可以通过使客户端对故障情况具有弹性来抵消