【问题标题】:GitHub App - generate permanent installation access tokenGitHub App - 生成永久安装访问令牌
【发布时间】:2017-11-11 23:00:56
【问题描述】:

有没有办法让安装 GitHub 应用程序的用户生成一个永久安装访问令牌,该应用程序可以使用该令牌来作为该应用程序进行身份验证和执行操作?

我想创建一个简单的 GitHub 应用程序,该应用程序将在 CI 服务器上运行,并使用其中一个测试的数据对 PR 进行评论。

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

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

我意识到用户可以提供用户访问令牌,并且应用程序可以通过这种方式进行身份验证 - 但是当应用程序 cmet 时,它需要显示为来自应用程序,而不是用户(我不相信这会如果应用使用用户访问令牌进行身份验证,则会发生这种情况)。

【问题讨论】:

    标签: authentication github github-api


    【解决方案1】:

    我认为您可能会将“GitHub 应用程序”与访问 GitHub API 的更通用的工具概念混淆。 Apps 系统是一种为 GitHub 构建托管服务的特定方式,该服务具有自己的身份验证模型。用户不能自己运行应用程序,因为它只是围绕托管/SaaS 工具设计的。对于某人自己运行的东西,您需要最终用户在 GitHub 上为机器人创建一个新用户帐户,然后对其进行身份验证(OAuth 或个人访问令牌,无关紧要)。

    【讨论】:

    • 是的 - 我了解 GitHub 应用程序不应该由用户直接运行。我只是想避免强迫用户创建一个新的 GitHub 帐户来充当机器人。他们可能已经有第二个帐户充当另一个机器人(我相信 TOS 在技术上只允许 1 个机器人帐户/真人)。
    • 您是在制作应用程序还是其他碰巧使用 API 的东西?
    【解决方案2】:

    这是一个老问题,但为了在这里获得正确的信息...

    @osowskit 的回答在提到您需要使用 JWT 方面是正确的,但就必须使用 webhook 而言并非如此。使用应用程序进行访问控制确实有优势 - GitHub 应用程序可以仅对某些存储库授予特定访问权限。现在至少有一些 CI 系统(至少是 Jenkins)在某些用途上原生支持 GitHub 应用访问。

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

    获得代码后,使用 jwt 令牌没什么大不了的 - 它只涉及几个额外的 REST 调用。

    【讨论】:

      【解决方案3】:

      有没有办法让安装 GitHub 应用程序的用户生成一个永久安装访问令牌,该应用程序可以使用该令牌来作为该应用程序进行身份验证和执行操作?

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

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

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

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

      我意识到用户可以提供用户访问令牌,并且应用程序可以通过这种方式进行身份验证 - 但是当应用程序 cmet 时,它需要显示为来自应用程序,而不是用户(我不相信这会如果应用使用用户访问令牌进行身份验证,则会发生这种情况)。

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

      1. 编写您的 GitHub 应用以侦听 webhook 事件。
      2. 收到事件后,解析installation id 的负载
      3. 创建 JWT 后,由 authenticating as an application 生成 installation access token
      4. 使用上面生成的installation access token修改数据。请注意,此令牌会在一小时后过期。
      5. 利润!

      【讨论】:

      • 谢谢,但我认为您可能误解了我的用例。我的 GitHub 应用程序没有被 webhook 调用。它作为 CI 测试管道的一部分运行。第 3 步是不可能的,因为没有用户可以访问它的地方没有存储私钥的地方。该应用程序由最终用户运行。正如@coderanger 提到的,它可能无法实现我想要的。
      • 您可以将此应用程序作为独立服务运行 - 而不是在他们的 CI 系统上运行,这将允许预期的行为。如果不希望这样做,那么 OAuth 应用程序可能更合适。
      • 我明白 - 但这对于只需要评论 PR 的简单应用程序来说会增加很多开销。 OAuth App 带回了以用户身份发表评论的问题(我不希望 - 我希望它作为 App 发表评论)。
      猜你喜欢
      • 1970-01-01
      • 2022-07-15
      • 2013-01-11
      • 2018-01-31
      • 2013-01-20
      • 1970-01-01
      • 2018-02-08
      • 2011-09-11
      • 2021-10-24
      相关资源
      最近更新 更多