跳至主要内容

GitHub 应用与 OAuth 应用的区别

通常,GitHub 应用优于 OAuth 应用,因为它们使用细粒度权限,可以更好地控制应用可以访问哪些仓库,并使用短期令牌。

关于 GitHub Apps 和 OAuth 应用

通常情况下,GitHub Apps 比 OAuth 应用更受欢迎。GitHub Apps 使用细粒度权限,让用户可以更好地控制应用可以访问哪些仓库,并使用短期令牌。这些特性可以通过限制应用凭据泄露后可能造成的损害来增强应用的安全性。

与 OAuth 应用类似,GitHub Apps 仍然可以使用 OAuth 2.0 并生成一种 OAuth 令牌(称为用户访问令牌)并代表用户执行操作。但是,GitHub Apps 也可以独立于用户运行。这对于不需要用户输入的自动化操作非常有用。即使安装应用到组织的人员离开了该组织,应用也将继续工作。

GitHub Apps 具有内置的、集中的 Webhook。GitHub Apps 可以接收其可以访问的所有仓库和组织的 Webhook 事件。相反,OAuth 应用必须为每个仓库和组织单独配置 Webhook。

使用安装访问令牌的 GitHub Apps 的速率限制会随着仓库数量和组织用户数量的增加而扩展。相反,OAuth 应用的速率限制较低,并且不会扩展。

有一种情况是 OAuth 应用比 GitHub 应用更受欢迎。如果您的应用需要访问企业级资源(例如企业对象本身),则应使用 OAuth 应用,因为 GitHub 应用尚无法获得针对企业的权限。GitHub Apps 仍然可以访问企业拥有的组织和仓库资源。

有关 GitHub Apps 的更多信息,请参阅“关于创建 GitHub Apps”。

有关将现有 OAuth 应用迁移到 GitHub 应用的更多信息,请参阅“将 OAuth 应用迁移到 GitHub 应用”。

谁可以安装 GitHub Apps 并授权 OAuth 应用?

您可以在您的个人帐户或您拥有的组织中安装 GitHub Apps。如果您在仓库中具有管理员权限,则可以将 GitHub Apps 安装到组织帐户。如果在仓库中安装了 GitHub Apps 并且需要组织权限,则组织所有者必须批准该应用程序。

默认情况下,只有组织所有者可以管理组织中 GitHub Apps 的设置。要允许其他用户更改组织拥有的 GitHub Apps 的开发者设置,所有者可以授予他们 GitHub App 管理员权限。GitHub App 管理员无法管理第三方应用程序。有关在组织中添加和删除 GitHub App 管理员的更多信息,请参阅“组织中的角色”。

相比之下,用户会授权 OAuth 应用,这使应用能够以已认证用户的身份执行操作。例如,您可以授权一个查找已认证用户所有通知的 OAuth 应用。您可以随时撤销 OAuth 应用的权限。

组织所有者可以选择是否允许外部协作者请求访问未经批准的 OAuth 应用和 GitHub Apps。有关更多信息,请参阅“限制 OAuth 应用和 GitHub 应用访问请求”。

警告

撤销 OAuth 应用的所有权限将删除该应用程序代表用户生成的任何 SSH 密钥,包括部署密钥

GitHub AppsOAuth 应用
您必须是组织所有者或在仓库中具有管理员权限才能在组织上安装 GitHub App。如果在仓库中安装了 GitHub App 并且需要组织权限,则组织所有者必须批准该应用程序。您可以授权 OAuth 应用访问资源。
您可以在您的个人仓库上安装 GitHub App。您可以授权 OAuth 应用访问资源。
您必须是组织所有者、个人仓库所有者或在仓库中具有管理员权限才能卸载 GitHub App 并删除其访问权限。您可以删除 OAuth 访问令牌以删除访问权限。
您必须是组织所有者或在仓库中具有管理员权限才能请求 GitHub App 安装。如果组织应用策略处于活动状态,则任何组织成员都可以请求在组织上安装 OAuth 应用。组织所有者必须批准或拒绝该请求。

GitHub Apps 和 OAuth 应用可以访问什么?

帐户所有者可以在一个帐户中使用 GitHub App,而无需授予另一个帐户访问权限。例如,您可以在雇主的组织中安装第三方构建服务,但决定不授予该构建服务访问您个人帐户中的仓库的权限。如果设置 GitHub App 的人离开了组织,该应用将保持已安装状态。

授权的 OAuth 应用可以访问用户或组织所有者可以访问的所有资源。

GitHub AppsOAuth 应用
安装 GitHub App 会授予该应用访问用户或组织帐户的选定仓库的权限。授权 OAuth 应用会授予该应用访问用户可访问资源的权限。例如,他们可以访问的仓库。
如果管理员从安装中删除了仓库,则来自 GitHub App 的安装令牌将失去对资源的访问权限。当用户失去访问权限时(例如,当他们失去对仓库的写入权限时),OAuth 访问令牌将失去对资源的访问权限。
安装访问令牌仅限于应用创建者选择的权限指定的仓库。OAuth 访问令牌通过范围进行限制。
GitHub Apps 可以请求对问题和拉取请求的单独访问权限,而无需访问仓库的实际内容。OAuth 应用需要请求repo范围才能访问问题、拉取请求或仓库拥有的任何内容。
GitHub Apps 不受组织应用策略的影响。GitHub App 只能访问组织所有者已授予的仓库。如果组织应用策略处于活动状态,则只有组织所有者才能授权安装 OAuth 应用。如果已安装,则 OAuth 应用将获得对组织所有者在批准的组织内拥有的令牌可见的任何内容的访问权限。
当安装发生更改或删除时,GitHub App 会收到 Webhook 事件。这会告诉应用创建者他们何时获得了更多或更少的对组织资源的访问权限。OAuth 应用可以随时根据授予用户访问权限的变化而失去对组织或仓库的访问权限。OAuth 应用不会在失去对资源的访问权限时通知您。

基于令牌的身份验证

注意

GitHub Apps 也可以使用基于用户的令牌。有关更多信息,请参阅“代表用户使用 GitHub App 进行身份验证”。

GitHub AppsOAuth 应用
GitHub App 可以使用带 JSON Web 令牌格式的私钥在带外请求安装访问令牌。OAuth 应用可以通过 Web 请求在重定向后将请求令牌交换为访问令牌。
安装令牌将应用识别为 GitHub Apps 机器人,例如 @jenkins-bot。访问令牌将应用识别为授予应用令牌的用户,例如 @octocat。
安装访问令牌在预定义的时间段后过期(目前为 1 小时)。OAuth 令牌保持活动状态,直到客户撤销它们。
安装在组织或仓库上的 GitHub Apps 受到速率限制,这些限制会随着安装数量的增加而扩展。有关更多信息,请参阅“GitHub Apps 的速率限制”。OAuth 令牌使用用户的每小时 5,000 次请求的速率限制。
速率限制增加可以在 GitHub Apps 级别(影响所有安装)和单个安装级别授予。速率限制增加是针对每个 OAuth 应用授予的。授予该 OAuth 应用的每个令牌都将获得增加的限制。
GitHub Apps 可以代表用户进行身份验证。授权流程与 OAuth 应用授权流程相同。用户访问令牌可能会过期,并可以使用刷新令牌进行续期。有关更多信息,请参阅“刷新用户访问令牌”和“代表用户使用 GitHub App 进行身份验证”。OAuth 应用使用的 OAuth 流程代表用户授权 OAuth 应用。这与生成 GitHub App 用户访问令牌所使用的流程相同。

请求资源的权限级别

与 OAuth 应用不同,GitHub Apps 具有目标权限,允许它们仅请求对其所需内容的访问权限。例如,持续集成 (CI) GitHub App 可以请求对仓库内容的读取访问权限和对状态 API 的写入访问权限。另一个 GitHub App 可能没有对代码的读取或写入访问权限,但仍然能够管理问题、标签和里程碑。OAuth 应用无法使用细粒度权限。

访问GitHub Apps(readwrite 权限)OAuth 应用
访问公共仓库安装期间需要选择公共仓库。public_repo 范围。
访问仓库代码/内容仓库内容repo 范围。
访问问题、标签和里程碑问题repo 范围。
访问拉取请求、标签和里程碑拉取请求repo 范围。
访问提交状态(用于 CI 构建)提交状态repo:status 范围。
访问部署和部署状态部署repo_deployment 范围。
通过 Webhook 接收事件GitHub App 默认包含一个 Webhook。write:repo_hookwrite:org_hook 范围。

仓库发现

GitHub AppsOAuth 应用
GitHub Apps 可以查看/installation/repositories以查看安装可以访问的仓库。OAuth 应用可以查看/user/repos以获取用户视图,或查看/orgs/:org/repos以获取可访问仓库的组织视图。
当仓库添加到安装或从安装中删除时,GitHub Apps 会收到 Webhook。OAuth 应用创建组织 Webhook 以在组织内创建新仓库时发出通知。

Webhook

GitHub AppsOAuth 应用
默认情况下,GitHub Apps 具有一个 Webhook,该 Webhook 会接收其配置为接收的每个仓库的事件。OAuth 应用请求 Webhook 范围以创建每个需要接收事件的仓库的仓库 Webhook。
GitHub Apps 会在组织成员的许可下接收某些组织级别的事件。OAuth 应用请求组织 Webhook 范围以创建每个需要接收组织级事件的组织的组织 Webhook。
卸载 GitHub App 后,Webhook 会自动禁用。

如果 OAuth 应用程序的访问令牌被删除,Webhooks 不会自动禁用,也没有办法自动清理它们。您需要请求用户手动执行此操作。

Git 访问

GitHub AppsOAuth 应用
GitHub Apps 请求仓库内容权限,并使用您的安装访问令牌通过基于 HTTP 的 Git 进行身份验证。有关更多信息,请参阅“为 GitHub App 生成安装访问令牌OAuth 应用程序请求 write:public_key 范围并通过 API 创建部署密钥。然后,您可以使用该密钥执行 Git 命令。
该令牌用作 HTTP 密码。该令牌用作 HTTP 用户名。

机器帐户与机器人帐户

机器用户帐户是基于 OAuth 的个人帐户,用于使用 GitHub 的用户系统隔离自动化系统。

机器人帐户特定于 GitHub Apps,并内置于每个 GitHub App 中。

GitHub AppsOAuth 应用
GitHub App 机器人不会消耗 GitHub Enterprise 许可证。机器用户帐户会消耗 GitHub Enterprise 许可证。
由于 GitHub App 机器人永远不会被授予密码,因此客户无法直接登录。机器用户帐户会被授予用户名和密码,由客户管理和保护。