如何在Java Spring Boot应用中使用GCP Workload Identity?遇403错误如何解决
GCP Workload Identity 403权限报错排查
错误原因
报错指向你当前用于调用GCP接口的身份,没有权限模拟目标工作负载服务账号proj-workload-id-svc-acct@idmp-mii-dev-ddb5.iam.gserviceaccount.com生成访问令牌,核心问题有两个:
- 你在
application.properties中配置的GOOGLE_APPLICATION_CREDENTIALS参数不会被GCP Java SDK自动识别,代码中调用StorageOptions.getDefaultInstance()时加载的是默认凭证(比如本地gcloud缓存凭证、运行环境的默认服务账号凭证),而非你指定的config.json凭证,导致实际发起请求的身份不符合预期。 - 实际发起请求的身份缺少
iam.serviceAccounts.getAccessToken权限,无法完成服务账号模拟生成AccessToken的操作。
解决方案
1. 修正凭证加载逻辑
手动加载你指定的config.json凭证构建Storage客户端,修改代码如下:
import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.storage.Bucket; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; import org.springframework.core.io.ClassPathResource; import java.io.IOException; private static void testListGCPBucket(String configPath) throws IOException { // 手动加载配置的凭证文件 GoogleCredentials credentials = GoogleCredentials.fromStream( new ClassPathResource(configPath).getInputStream() ); Storage storage = StorageOptions.newBuilder() .setCredentials(credentials) .build() .getService(); System.out.println("Buckets:"); Page<Bucket> buckets = storage.list(); for (Bucket bucket : buckets.iterateAll()) { System.out.println(bucket.toString()); } System.out.println("completed..."); }
2. 授予服务账号模拟权限
在GCP IAM控制台为config.json对应的身份,授予目标服务账号的Service Account Token Creator角色:
- 操作路径:进入GCP控制台「IAM与 admin」→「服务账号」,找到目标服务账号
proj-workload-id-svc-acct@idmp-mii-dev-ddb5.iam.gserviceaccount.com,进入「权限」页签,点击「授予访问权限」 - 新增主体:填写
config.json对应的服务账号邮箱/用户身份 - 分配角色:选择「Service Account Token Creator」(roles/iam.serviceAccountTokenCreator),保存后等待权限生效即可。
3. 部署到GKE环境的额外校验
如果应用部署在GKE集群使用Workload Identity,还需要确认:
- 集群已开启Workload Identity功能
- 应用使用的Kubernetes服务账号已和GCP服务账号完成绑定
- 应用Pod的
serviceAccountName字段已指定为绑定完成的Kubernetes服务账号
内容的提问来源于stack exchange,提问作者GURUDAS K S
相关产品推荐
相关产品推荐

