如何在Java中生成GCP identity-token?(替代gcloud CLI方式)
Java生成GCP Identity Token的实现方案
你可以借助Google官方的google-auth-library-oauth2-http库实现和gcloud auth print-identity-token等效的功能,以下是两种常见场景的实现思路和代码:
依赖配置
先在项目中引入Maven依赖:
<dependency> <groupId>com.google.auth</groupId> <artifactId>google-auth-library-oauth2-http</artifactId> <version>1.20.0</version> <!-- 建议使用最新稳定版 --> </dependency>
场景1:本地开发环境(复用gcloud用户凭据)
该逻辑和gcloud auth print-identity-token完全对齐,会自动读取本地的Application Default Credentials(需要先执行gcloud auth application-default login完成配置):
import com.google.auth.oauth2.IdentityToken; import com.google.auth.oauth2.IdentityTokenProvider; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; public class LocalIdentityTokenGenerator { public static void main(String[] args) throws IOException { // 加载本地默认凭据(对应gcloud登录的用户身份) GoogleCredentials credentials = GoogleCredentials.getApplicationDefault(); if (!(credentials instanceof IdentityTokenProvider)) { throw new IllegalStateException("当前凭据不支持生成Identity Token"); } IdentityTokenProvider tokenProvider = (IdentityTokenProvider) credentials; // 生成ID Token,若需指定受众(如调用特定服务),替换为对应URL/标识符 // 对应gcloud命令:gcloud auth print-identity-token --audience=xxx IdentityToken identityToken = tokenProvider.getIdToken(null); // 输出令牌内容 System.out.println(identityToken.getTokenValue()); } }
场景2:生产/服务端环境(使用服务账号)
如果在GCP服务(如GCE、GKE、Cloud Functions)中运行,会自动使用内置服务账号凭据;本地测试或外部环境可直接加载服务账号密钥文件:
import com.google.auth.oauth2.IdentityToken; import com.google.auth.oauth2.IdentityTokenProvider; import com.google.auth.oauth2.GoogleCredentials; import java.io.FileInputStream; import java.io.IOException; import java.util.Collections; public class ServiceAccountTokenGenerator { public static void main(String[] args) throws IOException { // 加载服务账号密钥文件 GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream("/path/to/service-account-key.json")) .createScoped(Collections.emptyList()); if (!(credentials instanceof IdentityTokenProvider)) { throw new IllegalStateException("服务账号凭据不支持生成Identity Token"); } IdentityTokenProvider tokenProvider = (IdentityTokenProvider) credentials; // 服务账号生成ID Token必须指定受众,替换为目标服务的标识符 String audience = "https://your-target-service.example.com"; IdentityToken identityToken = tokenProvider.getIdToken(audience); System.out.println(identityToken.getTokenValue()); } }
关键说明
- 本地环境需先执行
gcloud auth application-default login,否则会无法加载凭据 - 服务账号生成ID Token必须指定受众,用户凭据可省略(对应gcloud默认生成无受众令牌的逻辑)
- 生成的令牌有效期为1小时,过期后需重新生成
内容的提问来源于stack exchange,提问作者Ryuzaki
相关产品推荐
相关产品推荐

