GitHub CLI 支持自动刷新令牌:登录更省心,脚本却不能再缓存凭据

在终端登录一次 GitHub,后续命令就能持续使用,这种便利过去常常依赖长期有效的访问令牌。问题是,泄露出去的令牌也可能长期有效。

北京时间 2026 年 10 月 22 日凌晨,GitHub 宣布在 GitHub CLI 中公开预览可过期、自动刷新的 OAuth 凭据,要求 gh 2.103.0 或更新版本。用户主动选择后,gh 保存短期访问令牌和轮换的刷新令牌,在需要时刷新凭据。日常操作可以继续,但那些“登录时取一次 token,之后一直复用”的脚本需要重新检查。

登录状态可以持续,访问令牌不必长期有效

这项变化把两件事分开了:保持用户已授权的使用体验,以及让同一串访问令牌长期有效。

访问令牌用于实际请求,按官方描述会在数小时内到期;刷新令牌用于换取后续凭据,并随刷新过程轮换。gh 在需要新访问令牌时完成交换,用户不必每次都重新打开浏览器授权。

因此,单独泄露的访问令牌,其可用时间有了更短的上限。不过,这不等于可以忽略泄露。在有效期内,令牌仍可能被使用;如果刷新令牌或整台开发机也遭到控制,风险又是另一回事。缩短访问令牌寿命不能替代最小权限、及时撤销和终端保护。

官方没有在这篇公告中承诺所有环境都使用同一个精确小时数。接入时应检查服务器实际签发的凭据和到期状态,不宜把“数小时”写死成脚本里的刷新定时器。

当前需要主动启用,升级不会替你完成迁移

对于交互式开发环境,官方给出的单次登录选择是:

1
gh auth login --expiring

若希望后续登录都优先请求此类凭据,可以设置:

1
gh config set expiring_credentials enabled

这些是供读者评估后使用的官方命令示例,本文没有对实际账号执行重新登录或配置修改。设置登录偏好也不等于已有登录会话已经自动换成新凭据。

该功能目前是主动选择、向后兼容的公开预览。未选择的用户、已有登录和手动提供的令牌继续按原方式工作。GitHub 表示计划在未来版本中将其作为新登录的默认方式,不能据此声称今天所有账号已经切换。

服务器支持同样重要。公告列出的可用范围包括 github.com 和 ghe.com;GitHub Enterprise Server 从 GHES 3.23 开始签发此类凭据。旧服务器不支持时,--expiring 会回退为普通不过期令牌,所以命令成功并不能单独证明拿到了短期凭据。

检查时可以使用默认隐藏令牌内容的 gh auth status,关注凭据是否可刷新及到期信息。文档还提醒,该命令在令牌临近到期时也可能触发刷新,不能把它当成完全不改变认证状态的静态查看。

最容易出问题的是“先取出,再长期保存”

以前,有的脚本在启动时调用一次 gh auth token,把结果存进变量、配置文件或另一个工具的凭据缓存。只要访问令牌一直有效,这种写法可能很久都不出错。

换成短期凭据后,gh 管理的登录仍然有效,外部工具拿着的旧字符串却已经到期。这会形成一种很难凭直觉排查的现象:终端里 gh 能用,旁边的脚本持续收到认证失败。

官方建议,外部工具每次需要令牌时重新通过 gh auth token 获取,该命令会在需要时刷新后再返回。这里说的是新的访问令牌应在使用时获取,不是把刷新令牌交给每个脚本自行管理。

如果功能本来就能由 gh api 或其他 gh 子命令完成,直接让 gh 发起请求,通常比把令牌复制到多个程序更容易维护。确实需要交给外部客户端时,应限制传递和保存范围,避免日志回显、调试追踪和错误报告收集到凭据。

官方也明确说,如果某条工作流依赖一个长期不变的令牌,应暂缓为该工作流选择新模式,先解决凭据获取和更新方式。仅仅加上 --expiring,不会自动修好第三方工具的缓存逻辑。

环境变量里的 token 不在自动刷新范围内

GitHub CLI 的认证来源不止一种。新功能没有把所有来源统一变成可刷新凭据。

使用方式 本次变化的边界
通过支持的服务器登录并选择 --expiring gh 管理访问令牌和轮换的刷新令牌
用 GH_TOKEN 或 GITHUB_TOKEN 提供令牌 这些手动提供的令牌不会由 gh 自动刷新
把 gh auth token 的输出复制到其他工具 外部副本不会随 gh 的后续刷新而变化
Git 使用 SSH 密钥认证 不由这套 OAuth 访问令牌刷新机制接管

官方发布说明直接强调,GH_TOKEN 和 GITHUB_TOKEN 提供的令牌从不由 gh 刷新。文档也说明,相关认证环境变量会优先于存储的凭据。因此,在排查“已经登录但脚本还是失败”时,要确认脚本实际使用的是哪一种来源,而不只看交互终端的账号状态。

在 GitHub Actions 中,文档推荐把平台提供的 GITHUB_TOKEN 通过 GH_TOKEN 环境变量传给 gh。它的权限和生命周期按 Actions 的规则管理,不能用这次交互登录功能的行为来推断。

对无人值守任务,更合适的问题是“这项任务应使用什么身份、多少权限、怎样取得凭据”,而不是把开发机登录状态长期搬进 CI。

HTTPS 和 SSH 要分开排查

如果 Git 通过 HTTPS 访问 GitHub,且希望使用这套可过期凭据,官方推荐让 gh 担任 Git credential helper:

1
gh auth setup-git

由 gh 为 Git 提供和刷新凭据,可以避免把短期令牌交给不会更新它的独立缓存。官方同时建议使用 Git 2.46 或更新版本,以便标记令牌的到期信息,避免缓存超过其有效期。旧 Git 仍可配合使用,但会收到升级建议,不能把推荐版本误写为绝对运行门槛。

如果远端使用 SSH,git push 的认证通常由 SSH 密钥、代理和服务器侧授权决定。启用新的 OAuth 模式不等于轮换 SSH 密钥,也不会让 SSH 私钥自动过期。反过来,SSH 推送成功也不能证明 gh api 的认证正常。

在同一个项目里,Git 推送与 API 调用完全可能走两条认证路径。排查时先确认失败的是哪一条,再检查对应凭据,能少做很多没有必要的重新登录。

调整权限时,别把凭据类型换回去

还有一个容易被忽略的迁移细节。gh auth refresh 常用于调整授权 scopes,它与日常自动刷新访问令牌不是同一件事。

官方文档提醒,使用可过期凭据后,如果运行该命令调整权限,应同时传入 --expiring,或启用 expiring_credentials 偏好。否则,调整 scopes 的过程可能把现有凭据替换为不过期令牌。

这也说明团队验证不能止于首次登录。较完整的试点需要覆盖令牌到期后的命令调用、外部脚本再次取令牌、HTTPS helper,以及后续权限变更。多账号、多主机环境还要确认读取和刷新的确实是目标主机下的凭据。

凭据存储也值得检查。文档说明,gh 优先使用可用的操作系统 keyring,缺少相应支持时会回退到明文配置文件。短期访问令牌并不会消除本地存储的敏感性,刷新令牌尤其需要妥善保护。

结语

GitHub CLI 这次更新改善了一个长期存在的取舍:用户不必频繁登录,同时可以缩短单个访问令牌泄露后的有效窗口。

迁移的关键落在凭据使用方式上。把请求交给能刷新的组件,让外部工具在需要时取得新令牌,并分清环境变量、HTTPS 和 SSH 的边界,才能避免出现“登录没问题,自动化却坏了”的情况。

参考来源

文章目录
  1. 1. 登录状态可以持续,访问令牌不必长期有效
  2. 2. 当前需要主动启用,升级不会替你完成迁移
  3. 3. 最容易出问题的是“先取出,再长期保存”
  4. 4. 环境变量里的 token 不在自动刷新范围内
  5. 5. HTTPS 和 SSH 要分开排查
  6. 6. 调整权限时,别把凭据类型换回去
  7. 7. 结语
  8. 8. 参考来源
|