Authentication GitHub应用程序-生成永久安装访问令牌

Authentication GitHub应用程序-生成永久安装访问令牌,authentication,github,github-api,Authentication,Github,Github Api,有没有办法让安装GitHub应用程序的用户生成一个永久安装访问令牌,该令牌可由应用程序用于验证和执行与该应用程序相同的操作 我想创建一个简单的GitHub应用程序,它将在CI服务器上运行,并使用其中一个测试的数据对PRs进行注释 由于此应用程序由用户在其CI服务器上运行,因此无法存储GitHub应用程序的私钥,该私钥通常用于生成访问令牌,如前所述 理想情况下,如果用户可以为应用程序生成永久安装访问令牌,则当应用程序在CI服务器上运行时,他们可以安全地向应用程序提供该密钥,以便应用程序可以与Git

有没有办法让安装GitHub应用程序的用户生成一个永久安装访问令牌,该令牌可由应用程序用于验证和执行与该应用程序相同的操作

我想创建一个简单的GitHub应用程序,它将在CI服务器上运行,并使用其中一个测试的数据对PRs进行注释

由于此应用程序由用户在其CI服务器上运行,因此无法存储GitHub应用程序的私钥,该私钥通常用于生成访问令牌,如前所述

理想情况下,如果用户可以为应用程序生成永久安装访问令牌,则当应用程序在CI服务器上运行时,他们可以安全地向应用程序提供该密钥,以便应用程序可以与GitHub API通信并作为应用程序进行身份验证


我意识到用户可以提供一个用户访问令牌,应用程序也可以通过这种方式进行身份验证——但当应用程序评论时,它需要显示为源于应用程序,而不是用户(我认为如果应用程序使用用户访问令牌进行身份验证,这种情况不会发生)。

我认为您可能会混淆“GitHub应用程序”使用访问GitHub API的更通用的工具。应用程序系统是为GitHub构建托管服务的一种特定方式,它有自己的身份验证模型。用户不能自己运行应用程序,因为它只是围绕托管/SaaS工具设计的。对于有人自己运行的东西,您需要最终用户在GitHub上为bot创建一个新的用户帐户,然后进行身份验证(OAuth或personal access token都不重要)

有没有办法让安装GitHub应用程序的用户生成一个永久安装访问令牌,该令牌可由应用程序用于验证和执行与该应用程序相同的操作

也许吧,但这不必要。GitHub应用程序将仅对用户授予其访问权限的数据执行操作。应用程序在GitHub上修改的任何数据都将显示为应用程序“执行”的操作

理想情况下,如果用户可以为应用程序生成永久安装访问令牌,则当应用程序在CI服务器上运行时,他们可以安全地向应用程序提供该密钥,以便应用程序可以与GitHub API通信并作为应用程序进行身份验证

根据您提供的信息,这应该是不必要的。用户授权访问GitHub应用程序以访问特定资源并侦听特定事件;GitHub应用程序需要一个安装ID(或多个安装ID)才能与GitHub数据交互

好消息是,对于您概述的CI工作流,GitHub将在webhook负载中发送安装ID—可能是一个
push
事件

我意识到用户可以提供一个用户访问令牌,应用程序可以通过这种方式进行身份验证——但当应用程序评论时,它需要显示为源于应用程序,而不是用户(我认为如果应用程序使用用户访问令牌进行身份验证,这种情况不会发生)

不需要生成个人访问令牌(PAT),创建GitHub应用程序是为了避免创建服务帐户或向CI环境添加凭据

  • 编写GitHub应用程序以侦听webhook事件
  • 在接收到事件时,分析
    安装id的有效负载
  • 在创建JWT后生成安装访问令牌
  • 使用上面生成的
    安装访问令牌
    修改数据。请注意,此令牌将在一小时后过期
  • 利润
    这是一个老问题,但为了在这里获得正确的信息

    @osowskit的回答是正确的,提到需要使用JWT,但没有提到必须使用webhooks。使用应用程序进行访问控制确实有很多好处——GitHub应用程序只能被授予某些回购协议的特定访问权限。现在,至少有一些CI系统(至少Jenkins)支持GitHub应用程序的本地访问

    原始请求中的基本缺陷是请求与应用程序关联的永久PAT。这不是他们的工作方式。而是为应用程序生成一个私钥,该私钥应存储在CI secrets系统中。现在,你确实需要某种形式的拍拍来实际行动——在这里添加公关评论——只是你没有一个永久性的评论。相反,您每次需要运行时都会生成临时PAT-IIRC这些PAT持续大约一个小时,因此对于大多数单个作业都很有用,但每次都要生成,而不是存储为这样


    一旦你得到了代码,使用jwt代币就没什么大不了的了——它只需要几个额外的REST调用。

    是的——我知道GitHub应用程序不应该由用户直接运行。我只是想避免强迫用户创建一个新的GitHub帐户来充当bot。他们可能已经有第二个帐户充当另一个机器人(我相信TOS技术上只允许1个机器人帐户/真人)。你是在制作应用程序还是其他碰巧使用API的东西?谢谢,但我想你可能误解了我的用例。webhook未调用我的GitHub应用程序。它作为CI测试管道的一部分运行。第3步是不可能的,因为如果用户没有访问权,就没有存储私钥的地方。应用程序正在由最终用户运行。正如@coderanger提到的,可能无法实现我想要的功能。您可以将此应用程序作为独立服务运行,而不是在他们的CI系统上运行,这将允许预期的行为。如果不希望这样,那么OAuth应用程序可能更合适。我理解-但对于一个只需要对PRs进行评论的简单应用程序来说,这会增加很多开销。OAuth应用程序带来了作为用户进行评论的问题(我不希望它作为应用程序进行评论)。