在企业安装 GitHub App,不代表能读取所有仓库代码
读取公司设置的脚本,有时仍依赖一位离职员工的个人令牌。GitHub 在10月23日宣布,GitHub Apps 企业安装正式发布,更多管理流程可以从 classic PAT 迁移。不过,“安装到企业”并不意味着能读取企业内的全部代码。
企业应用能管理什么
公告涉及仓库策略、ruleset、读取绕过申请以及 IP 允许列表等管理功能。例如,把绕过申请汇总到审核页面的应用,可以考虑 Enterprise bypass requests 的读取权限。查看申请与修改规则需要不同权限,无需为了采用新功能一次开启全部写入权限。
企业安装仅授予企业权限。即使应用注册时也申请了组织或仓库权限,这次安装也不会授予它们。要读取两个组织的代码,需要在相关组织分别安装,并授予相应仓库访问权限。因此,能读取企业设置却无法读取代码,并不一定表示安装失败。
同一个应用可以有多个安装
假设企业 acme 包含 web 和 mobile 两个组织。同一应用安装到这三个账户后,就有三个安装。企业安装令牌不能替代 web 组织令牌,web 令牌也不能跨到 mobile。下图是为解释虚构案例而自行绘制的,并非真实 GitHub 产品界面。

因此,令牌缓存不宜只用应用名称作为键。加入 installation ID,可以避免企业策略任务与仓库读取任务误用同一令牌。这是把文档中的账户边界落实到程序结构的实现示例。
应用权限与用户权限的交集
用户访问令牌同时受应用权限和用户权限限制。如果用户只有读取权限,即使应用拥有写入权限,也不能代表该用户越权操作。安装访问令牌则按照该安装获得的应用权限运行。
签发安装令牌需要应用 JWT 和目标 installation ID。文档说明了 POST /app/installations/INSTALLATION_ID/access_tokens,以及一小时有效期。Octokit 可以处理生成和到期后的重新生成。短期令牌仍需要保护应用私钥,并按安装区分缓存。

替换个人令牌之前
如果旧脚本同时查询企业策略和多个组织的代码,只替换令牌字符串可能不够。应拆分任务,检查每个 API 是否支持 GitHub Apps,以及所需认证方式。并非所有企业 GraphQL 操作都支持应用。从读取任务开始,更容易比较结果和访问边界。
资料更新也存在时差:10月23日的 changelog 写明正式发布,但今天查看的安装文档仍保留 public preview 字样。本文以有日期的公告判断发布状态,以文档说明权限范围。真正的变化,是能够按账户和任务设计自动化,而不是复制某个人的全部广泛权限。
来源与延伸阅读
GitHub Docs · Enterprise installation