关于 GitHub Apps 和 OAuth apps
一般来说,GitHub Apps 优先于 OAuth apps。 GitHub Apps 使用精细权限,让用户更好地控制应用可以访问的存储库,并使用生存期较短的令牌。 这些属性可以限制在应用的凭据泄露时可能造成的损害,从而强化应用的安全性。
与 OAuth apps 类似,GitHub Apps 仍可使用 OAuth 2.0 并生成一种类型的 OAuth 令牌(称为用户访问令牌)并代表用户执行操作。 但是,GitHub Apps 也可以独立于用户进行操作。 这有利于不需要用户输入的自动化。 即使在组织上安装应用的人离开组织,该应用仍将继续工作。
GitHub Apps 具有内置的集中式 Webhook。 GitHub Apps 可以接收应用可以访问的所有存储库和组织的 Webhook 事件。 相反,OAuth apps 必须为每个存储库和组织单独配置 Webhook。
使用安装访问令牌的 GitHub Apps 的速率限制随存储库数和组织用户数而缩放。 相反,OAuth apps 的速率限制较低,并且无法缩放。
有一种情况是 OAuth app 优先于 GitHub App。 如果应用需要访问企业级资源(例如企业对象本身),则应使用 OAuth app,因为尚不能向 GitHub App 授予针对企业的权限。 GitHub Apps 仍可访问企业拥有的组织和存储库资源。
若要详细了解 GitHub Apps,请参阅“关于创建 GitHub 应用”。
有关将现有 OAuth app 迁移到 GitHub App 的详细信息,请参阅“将 OAuth 应用迁移到 GitHub 应用”。
哪些人可以安装 GitHub 应用并授权 OAuth apps?
您可以在您的个人帐户或您拥有的组织中安装 GitHub 应用程序。 如果拥有仓库管理员权限,您可以在组织帐户上安装 GitHub 应用程序。 如果 GitHub 应用程序安装在仓库中,并且需要组织权限,则组织所有者必须批准该应用程序。
默认情况下,只有组织所有者才可管理组织中 GitHub 的设置。 若要允许其他用户更改组织拥有的 GitHub 应用的开发人员设置,所有者可以向他们授予 GitHub 应用管理器权限。 GitHub 应用管理器无法管理第三方应用程序。 有关在组织中添加和删除 GitHub 应用管理员的详细信息,请参阅“组织中的角色”。
相比之下,用户为 OAuth apps 授权,使应用能够以经过身份验证的用户身份执行操作。 例如,你可以授权 OAuth app 查找经身份验证用户的所有通知。 你始终可以从 OAuth app 撤消权限。
作为组织所有者,可以选择是否允许外部协作者请求访问未经审批的 OAuth apps 和 GitHub Apps。 有关详细信息,请参阅“限制 OAuth 应用和 GitHub 应用访问请求”。
警告:从 OAuth app 撤销所有权限将会删除应用程序代表用户生成的所有 SSH 密钥,包括部署密钥。
GitHub 应用 | OAuth apps |
---|---|
您必须是组织所有者或者具有仓库管理员权限才能在组织上安装 GitHub 应用程序。 如果 GitHub 应用程序安装在仓库中,并且需要组织权限,则组织所有者必须批准该应用程序。 | 你可以授权 OAuth app 访问资源。 |
您可以在个人仓库上安装 GitHub 应用程序。 | 你可以授权 OAuth app 访问资源。 |
您必须是组织所有者、个人仓库所有者或者拥有仓库的管理员权限才能卸载 GitHub 应用程序和删除其访问权限。 | 您可以删除 OAuth 访问令牌以删除访问权限。 |
您必须是组织所有者或者具有仓库管理员权限才能请求安装 GitHub 应用程序。 | 如果组织应用程序策略已激活,则任何组织成员都可以请求在组织上安装 OAuth app。 组织所有者必须批准或拒绝请求。 |
GitHub 应用和 OAuth apps 可以访问哪些内容?
帐户所有者可以在一个帐户中使用 GitHub App ,而不授予对其他帐户的访问权限。 例如,您可以在您的雇主组织中安装第三方构建服务,但决定不授权该构建服务访问您个人帐户中的仓库。 即使安装者离开组织,GitHub 应用程序仍然存在。
授权的 OAuth app 有权访问用户或组织所有者可访问的所有资源。
GitHub 应用 | OAuth apps |
---|---|
安装 GitHub 应用会授予应用对用户或组织帐户所选存储库的访问权限。 | 为 OAuth app 授权会授予应用访问用户可访问资源的权限。 例如,它们可以访问的存储库。 |
如果管理员从安装中删除仓库,则 GitHub 应用程序的安装令牌将失去对资源的访问权限。 | 当用户失去对资源的访问权限时,例如失去对仓库的写入权限,OAuth 访问令牌也会失去相应的访问权限。 |
安装访问令牌仅限于具有应用创建者所选权限的指定存储库。 | OAuth 访问令牌通过作用域进行限制。 |
GitHub Apps 可以请求单独访问议题和拉取请求,而不访问仓库的实际内容。 | OAuth apps 需要请求 repo 范围才能访问问题、拉取请求或存储库拥有的任何内容。 |
GitHub 应用不受组织应用程序策略约束。 GitHub 应用仅有权访问组织所有者已授予的存储库。 | 如果组织应用程序策略处于活动状态,则只有组织所有者才能授权安装 OAuth app 。 如果已安装,OAuth app 可以访问组织所有者在批准的组织中拥有的令牌可见的任何内容。 |
当安装被更改或删除时,GitHub 应用程序会收到 web 挂钩事件。 当它们对组织资源的访问权限扩大或缩小时,这将告诉应用程序创建者。 | 根据授予用户访问权限的变化,OAuth apps 可能会随时失去对组织或存储库的访问权限。 OAuth app 在失去对资源的访问权限时不会通知你。 |
基于令牌的识别
注意:GitHub 应用也可以使用基于用户的令牌。 有关详细信息,请参阅“代表用户使用 GitHub 应用进行身份验证”。
GitHub 应用 | OAuth apps |
---|---|
GitHub 应用可以使用带外 JSON Web 令牌格式的私钥请求安装访问令牌。 | OAuth app 可以通过 Web 请求在重定向后将请求令牌交换为访问令牌。 |
安装令牌将应用标识为 GitHub 应用机器人,例如 @jenkins-bot。 | 访问令牌将应用标识为向应用授予令牌的用户,例如 @octocat。 |
安装访问令牌在预定义的时间(当前为 1 小时)后过期。 | OAuth 令牌在被客户撤销之前一直保持活动状态。 |
安装在组织或存储库上的 GitHub Apps 受随安装数量缩放的速率限制约束。 有关详细信息,请参阅“GitHub 应用的速率限制”。 | OAuth 令牌使用每小时 5,000 个请求的用户速率限制。 |
可以在 GitHub 应用级别(影响所有安装)和单个安装级别授予速率限制增加。 | 根据 OAuth app 授予速率限制提高。 授予该 OAuth app 的每个令牌都会获得提高的限制。 |
GitHub Apps 可以用户身份进行身份验证。 授权流与 OAuth app 授权流相同。 用户访问令牌可能过期,可以使用刷新令牌进行续订。 有关详细信息,请参阅“刷新用户访问令牌”和“代表用户使用 GitHub 应用进行身份验证”。 | OAuth apps 使用的 OAuth 流程代表用户授权 OAuth app。 这与用于生成 GitHub App 用户访问令牌的流程相同。 |
请求资源的权限级别
与 OAuth apps 不同,GitHub 应用具有针对性的权限,只允许它们请求访问所需的资源。 例如,持续集成 (CI) GitHub 应用程序可以请求对仓库内容的读取权限和对状态 API 的写入权限。 另一个 GitHub 应用程序可能没有对代码的读取或写入权限,但仍能管理议题、标签和里程碑。 OAuth apps 无法使用精细权限。
Access | GitHub 应用(read 或 write 权限) | OAuth apps |
---|---|---|
访问公共存储库 | 需要在安装过程中选择公共仓库。 | public_repo 范围。 |
访问存储库代码/内容 | 仓库内容 | repo 范围。 |
获取问题、标签和里程碑 | 问题 | repo 范围。 |
获取拉取请求、标签和里程碑 | 拉取请求 | repo 范围。 |
访问提交状态(对于 CI 构建) | 提交状态 | repo:status 范围。 |
访问部署和部署状态 | 部署 | repo_deployment 范围。 |
通过 Webhook 接收事件 | GitHub 应用程序默认包含一个 web 挂钩。 | write:repo_hook 或 write:org_hook 范围。 |
仓库发现
GitHub 应用 | OAuth apps |
---|---|
GitHub 应用可在 /installation/repositories 处查看可以访问的存储库。 | OAuth apps 可在 /user/repos 处查看可访问存储库的用户视图,或在 /orgs/:org/repos 处查看可访问存储库的组织视图。 |
当从安装中添加或删除仓库时,GitHub 应用程序会接收 web 挂钩。 | 在组织内创建新存储库时,OAuth apps 为通知创建组织 Webhook。 |
Webhook
GitHub 应用 | OAuth apps |
---|---|
默认情况下,GitHub 应用程序有一个 web 挂钩,可根据配置接收它们有权访问的每个仓库中的事件。 | OAuth apps 请求 Webhook 作用域为它们需要接收其事件的每个存储库创建存储库 Webhook。 |
GitHub 应用程序使用组织成员的权限接收某些组织级别的事件。 | OAuth apps 请求组织 Webhook 作用域为它们需要接收其组织级别事件的每个组织创建组织 Webhook。 |
卸载 GitHub 应用时,会自动禁用 Webhook。 | 如果删除 OAuth app 的访问令牌,则不会自动禁用 Webhook,并且无法自动清理它们。 必须要求用户手动执行此操作。 |
Git 访问
GitHub 应用 | OAuth apps |
---|---|
GitHub 应用请求存储库内容权限,并使用安装访问令牌通过基于 HTTP 的 Git 进行身份验证。 有关详细信息,请参阅“为 GitHub 应用生成安装访问令牌”。 | OAuth apps 请求 write:public_key 作用域,并通过 API 创建部署密钥。 然后,可以使用该密钥执行 Git 命令。 |
令牌用作 HTTP 密码。 | 令牌用作 HTTP 用户名。 |
机器与机器人帐户
机器用户帐户是基于 OAuth 的个人帐户,它使用 GitHub 的用户系统隔离自动系统。
机器人帐户特定于 GitHub 应用,并内置于每个 GitHub 应用程序中。
GitHub 应用 | OAuth apps |
---|---|
GitHub 应用程序机器人不占用 GitHub Enterprise 席位。 | 机器用户帐户占用 GitHub Enterprise 席位。 |
由于 GitHub 应用程序机器人永远不会被授予密码,因此客户无法直接登录它。 | 机器用户帐户被授予由客户管理和保护的用户名和密码。 |