如何将GCP服务账号短期凭据配置为应用默认凭据
背景
我需要让外部持续交付服务以GCP服务账号身份认证,GCP官方文档出于安全考虑推荐使用短期凭据:
以服务账号身份进行认证最安全的方式是获取该账号的短期凭据,形式为OAuth 2.0访问令牌。
我的目标是通过GOOGLE_APPLICATION_CREDENTIALS环境变量将短期令牌设置为应用默认凭据,但不知道如何将Bearer令牌转换为符合ADC格式的JSON文件。由于程序调用多个GCP客户端(存储、GKE、密钥管理器),手动为每个客户端设置凭据成本高,因此希望依赖ADC机制自动处理。
已尝试操作
- 生成短期令牌:
gcloud auth print-access-token --impersonate-service-account=$SA@$PROJ.iam.gserviceaccount.com
- 通过环境变量
$MY_TOKEN将令牌传递给持续交付服务。 - 将令牌写入临时JSON文件
/tmp/sa-creds.json,格式为{"token": "$MY_TOKEN"}。 - 设置
GOOGLE_APPLICATION_CREDENTIALS=/tmp/sa-creds.json,期望客户端库自动使用该凭据,但操作失败,因为格式不符合ADC要求。
解决方案
核心说明
应用默认凭据(ADC)不支持直接传入已生成的静态Bearer令牌,因为ADC的设计是让客户端库自动完成凭据的获取、刷新逻辑,而非直接使用一次性令牌。以下是两种可行的替代方案:
方案一:通过服务账号模拟生成ADC配置
使用gcloud命令直接生成符合ADC格式的配置文件,客户端库会自动用该配置获取短期凭据:
# 交互式模式(本地环境) gcloud auth application-default login --impersonate-service-account=$SA@$PROJ.iam.gserviceaccount.com
执行后会生成默认路径~/.config/gcloud/application_default_credentials.json的ADC配置文件,包含自动刷新凭据所需的信息。
如果是CI/CD等非交互式环境,使用:
gcloud auth application-default login --impersonate-service-account=$SA@$PROJ.iam.gserviceaccount.com --no-launch-browser
命令会输出一个授权链接,在可访问浏览器的环境完成授权后,将返回的授权码输入终端即可生成ADC配置。
方案二:使用工作负载身份(推荐CI/CD环境)
如果你的持续交付服务支持OIDC协议,推荐使用GCP工作负载身份实现无密钥认证:
- 在GCP中创建工作负载身份池及提供者,关联CI/CD服务的OIDC issuer。
- 为目标服务账号添加IAM绑定,允许工作负载身份池中的身份模拟该服务账号。
- 在CI/CD流程中,通过OIDC自动获取GCP短期凭据,客户端库会自动识别并将其作为ADC使用,无需手动管理令牌或配置文件。
失败原因说明
你之前创建的{"token": "$MY_TOKEN"}格式不符合ADC的规范:ADC的JSON配置文件需要包含client_id、client_secret、refresh_token等用于自动刷新凭据的字段,或是完整的服务账号密钥格式(不推荐长期使用),单纯的访问令牌无法被GCP客户端库识别为有效的ADC配置。
内容的提问来源于stack exchange,提问作者Joe

