
截至2026年09月,本文基于 Google Cloud CLI(gcloud CLI 当前主版本号 ≥ 520)撰写,覆盖绝大多数仍在维护的项目环境。如果你最近刚被
gcloud报错折磨过,那这篇文章大概率能救你一命。

一、先看现象:你是不是也遇到了这个报错?
说真的,gcloud CLI 这东西平时用得好好的,一旦认证出问题就特别让人抓狂——命令格式没变、配置文件没动,怎么突然就报错了?我自己踩过坑,也帮同事远程救过场,发现出问题的报错信息基本就集中在下面两种:
报错样本 A:invalid auth credentials
ERROR: (gcloud) There was a problem refreshing the current auth token:
Request had invalid authentication credentials. Expected OAuth 2 access token,
login cookie or other valid authentication credential. See
https://developers.google.com/identity/sign-in/web/devconsole-project.
报错样本 B:RefreshTokenRefreshError invalid_grant
ERROR: gcloud crashed (RefreshTokenRefreshError): invalid_grant:
The OAuth client was not found.
除了上面这两种典型的 token 失效,还有一个非常让人迷惑的现象:执行 gcloud projects list 时返回 403 权限拒绝,但同一个账号在 Google Cloud 网页控制台登录一切正常,能正常看项目、能正常操作资源。这种”网页端能用、CLI 端报 403″的对比情况,基本属于 gcloud CLI 认证排障的”经典场景”了。
如果你看到的报错和上面三种之一对得上,那下面的排查步骤请一步步往下走。
二、快速排查决策表(先看这张图再动手)
为了不浪费你的时间,我先把所有可能的原因和对应的修复方式整理成决策表,建议先对照着看一下自己属于哪种情况,再决定从哪一步开始:
| 报错关键词 | 最可能原因 | 第一步该做什么 |
|---|---|---|
invalid authentication credentials |
access_token 过期或本地缓存损坏 | 重新执行 gcloud auth login |
RefreshTokenRefreshError invalid_grant |
refresh_token 被吊销 / OAuth Client 失效 | 删除本地凭据目录后重新登录 |
403 Permission Denied 但网页端正常 |
IAM 权限缺失或项目切换错乱 | 检查 gcloud config get-value project |
Reauthentication required |
凭据过了 12 小时强制重认证窗口 | 加 --no-launch-browser 或换 ADC 方式 |
Application Default Credentials not found |
ADC 未配置 | 执行 gcloud auth application-default login |
could not find default credentials |
服务账号密钥未设置 | 检查 GOOGLE_APPLICATION_CREDENTIALS 环境变量 |
说白了,上面这张表就是帮你”对号入座”的。下面我按照从最常见到最冷门的顺序,把每一种情况的完整修复流程都写出来。
三、完整排查与解决步骤(按顺序往下试)
步骤 1:先更新一下 gcloud CLI 本身
讲个冷知识:很多认证报错其实不是凭据坏了,而是客户端版本太旧——Google 偶尔会调整认证接口,旧版本发出去的 token 在新版本校验时就会失败。稳妥起见,先升级:
gcloud components update
或者如果你用的是独立安装包(非通过 apt/yum),可以用包管理器升级到最新稳定版。升级完成后,重新跑一次失败的命令看看有没有改善。
步骤 2:重新走一遍用户登录流程
这是最常见也最有效的办法,90% 的 invalid auth credentials 都能在这一步解决:
gcloud auth login
如果你的服务器没有图形界面(比如纯 SSH 进去的远程开发机),默认情况下 --launch-browser 会失败。这时候推荐用设备流登录:
gcloud auth login --no-launch-browser
执行后终端会给你一个一次性 URL 和验证码,你在本地有浏览器的电脑上打开那个 URL、输入验证码完成授权,远程机器就会自动拿到凭据。说真的,这个参数真的香,救过我好几次。
步骤 3:清理本地残留凭据缓存
有时候 token 文件被损坏、或 refresh_token 已经被服务端吊销但本地还留着旧值,光重新登录是不够的,必须先把缓存清掉。gcloud CLI 的凭据默认放在这个目录:
# 先确认目录位置(不同系统可能略有差异)
ls ~/.config/gcloud/
# 删除过期的 access_tokens 和 legacy_credentials 目录
rm -rf ~/.config/gcloud/access_tokens
rm -rf ~/.config/gcloud/legacy_credentials
# 重新登录
gcloud auth login
注意:~/.config/gcloud/credentials.db 这个 SQLite 文件别动,那是你的核心凭据数据库,删了会导致所有账号都需要重新登录。
步骤 4:检查并修复 Application Default Credentials (ADC)
如果你跑的应用代码(Python、Go、Node.js 等)是通过 ADC 自动获取凭据的,那登录方式跟 CLI 命令行不太一样,需要单独配置:
gcloud auth application-default login
这条命令生成的凭据文件会放在 ~/.config/gcloud/application_default_credentials.json,跟 gcloud auth login 的凭据是两个独立的位置,别混为一谈。很多同学搞了半天发现没生效,就是因为只跑了其中一个。
步骤 5:服务账号密钥方式(ADC Key File)
如果是 CI/CD 环境或者无头服务器,没法走交互式登录,那就只能用服务账号密钥文件:
# 1. 把下载的 JSON 密钥文件放到安全路径,比如 /opt/gcp/sa-key.json
# 2. 设置环境变量
export GOOGLE_APPLICATION_CREDENTIALS="/opt/gcp/sa-key.json"
# 3. 验证凭据是否生效
gcloud auth activate-service-account --key-file=/opt/gcp/sa-key.json
不过这里要敲个黑板——长期服务账号密钥是 Google 官方已经不推荐的姿势。截至2026年,Google Cloud 在 IAM 安全最佳实践里已经把”避免长期密钥”列得很重,建议优先考虑下面的替代方案。
步骤 6:检查项目切换与 IAM 权限
当你看到”网页端能用、CLI 端报 403″这种诡异场景时,大概率是项目上下文没切对。先确认当前 CLI 用的项目:
# 查看当前生效的项目
gcloud config get-value project
# 查看所有配置
gcloud config list
# 切换到正确的项目
gcloud config set project YOUR_PROJECT_ID
如果项目没切错,那就得查 IAM 角色了:
# 查看当前账号在指定项目上的角色绑定
gcloud projects get-iam-policy YOUR_PROJECT_ID \
--flatten="bindings[].members" \
--format='table(bindings.role, bindings.members)'
权限里至少得有 roles/viewer(查看)或对应资源的 roles/editor、roles/owner,否则再怎么重新登录也是 403。
四、CI/CD 与无头环境的特殊处理
GitHub Actions / GitLab CI 推荐用法
在 CI/CD 里跑 gcloud 命令,最稳妥的是用 Workload Identity Federation,避免把 JSON 密钥文件直接塞到仓库或 Secrets 里。
GitHub Actions 示例(简化版):
- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
with:
workload_identity_provider: projects/${{ env.PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-pool/providers/github-provider
service_account: deployer@${{ env.PROJECT_ID }}.iam.gserviceaccount.com
这样 token 是短生命周期的(通常 1 小时左右),过期自动续签,从根本上避免了 refresh_token 失效的烦恼。
如果必须用密钥文件
把密钥放在 CI 的 Secrets 里,并在每次任务结束后清理:
echo "$GCP_SA_KEY" > /tmp/sa-key.json
export GOOGLE_APPLICATION_CREDENTIALS="/tmp/sa-key.json"
# ... 执行任务 ...
rm -f /tmp/sa-key.json
unset GOOGLE_APPLICATION_CREDENTIALS
五、预防措施:怎么让认证问题少发生一次
踩过几次坑之后,我总结了一套日常习惯,按这个来基本不会再被坑到:
- 固定周期清理凭据缓存:每周或每两周跑一次
gcloud auth login --no-launch-browser,保持 token 是新鲜的; - 升级 gcloud CLI 别拖延:Google 发版节奏不算慢,新版本往往修了认证相关的 bug;
- 生产环境一律走 ADC:本地开发可以
gcloud auth login,生产/CI 强烈建议 ADC + IAM API; - 密钥文件权限收紧:JSON 密钥务必
chmod 600,避免被其他用户读到; - 多用项目级服务账号:别一上来就用 Owner 级别的账号,分清楚权限边界;
- 把”当前项目”显式写出来:在脚本开头固定
gcloud config set project xxx,避免漏切项目导致操作错乱。
六、2026 年认证最佳实践小结
截至2026年09月,Google Cloud 在认证这块的整体趋势是”短生命周期、最小权限、能不下载密钥就别下载”。结合官方文档和我们项目里的实际落地经验,给大家总结几条最关键的建议:
- 能不下载 JSON 密钥就别下载。能用 Workload Identity Federation 的场景(GKE、Cloud Run、GitHub Actions、GitLab CI、本地模拟元数据服务器等)一律走 Federation,这是当下最推荐的姿势;
- 服务账号优先使用短期凭据。通过
gcloud auth print-access-token拿到的 token 默认只有 1 小时有效期,过期自动失效,减少泄漏风险; - 避免在多个机器上共用同一套凭据。一旦某个环境出问题,会牵连所有其他机器重新登录;
- 定期做 IAM 权限审计。用
gcloud projects get-iam-policy检查有没有遗留的多余角色绑定; - 开启 Cloud Audit Logs。所有 OAuth token 的签发和调用都会留痕,出了问题能快速回溯;
- 尽量避免使用 Owner 角色。改用细分的预定义角色或自定义角色,把权限边界卡死;
- 本地开发推荐 ADC。
gcloud auth application-default login生成的凭据可以让你的应用代码和 CLI 命令共用同一套身份,省掉很多重复配置。
七、常见问题 FAQ
Q1:gcloud auth login 和 gcloud auth application-default login 到底有什么区别?
简单说:gcloud auth login 是给 gcloud CLI 命令行自己用的凭据,存放在内部 SQLite 数据库里;gcloud auth application-default login 是给应用程序代码(用客户端库调用 GCP API)用的凭据,存放在一个独立的 JSON 文件里。两者互不影响,建议两个都跑一下。
Q2:明明刚登录成功,过几分钟又报 invalid_grant 怎么办?
这种情况通常是本地 credentials.db 里的 refresh_token 跟服务端对不上了。最稳妥的解决办法是彻底清掉所有凭据缓存,然后重新登录:
gcloud auth revoke --all
rm -rf ~/.config/gcloud/legacy_credentials
rm -rf ~/.config/gcloud/access_tokens
gcloud auth login --no-launch-browser
Q3:报 Reauthentication required 但我不想每次都点浏览器怎么办?
两个思路:一是换 ADC 模式;二是把登录流程做成自动化脚本,例如 gcloud auth login --no-launch-browser + 把一次性 URL 推送到 Slack/邮件里。
Q4:服务账号密钥文件还能不能用?官方真的不让用了吗?
能用,但不推荐。Google 官方是把”避免创建长期服务账号密钥”列在安全最佳实践里,而不是直接禁用。如果你是在 legacy 项目里没法立刻迁移,可以临时用着,但一定要把权限收窄、文件权限设到 600、并放在 CI Secrets 里,千万别 commit 到代码仓库。
Q5:网页端能正常操作,CLI 一直 403,怎么快速定位是权限还是凭据问题?
先用 gcloud config get-value project 确认 CLI 跑的是不是同一个项目;如果项目对得上,再用 gcloud projects get-iam-policy 看自己绑的角色;如果角色也没问题,那八成是 ADC 没配置或环境变量没设置。
Q6:Workload Identity Federation 配置复杂吗?我值得迁移过去吗?
如果是本地开发机,简单场景用 ADC 就够了,没必要硬上 Federation。但只要涉及 CI/CD、生产环境、或者多云场景,Workload Identity Federation 几乎一定要用——它的 token 是短生命周期的,安全性比长期密钥高一截,而且免去了密钥轮换的麻烦。
八、写在最后
gcloud CLI 认证这块,说复杂不复杂、说简单不简单,关键是要把”凭据存哪、过期了怎么办、权限够不够”这三件事捋清楚。第一次踩坑两个小时、第二次踩坑半小时、第三次基本一眼就能看出来——希望这篇指南能帮你少走点弯路。
如果文章里某个步骤对你有用、或者你还有别的报错场景没覆盖到,欢迎在评论区交流,咱们一起把这张决策表越补越完整。