非GCP环境应用如何使用WIF token访问PubSub并实现令牌自动刷新
问题1解答:当前WIF Token使用方式的合规性说明
- 你当前手动获取WIF访问令牌、导出到
GOOGLE_OAUTH_ACCESS_TOKEN环境变量启动应用的方式,仅适合本地临时调试场景,不属于生产环境规范方案。 - 存在的核心问题:手动获取的Oauth2访问令牌默认有效期仅为1小时,到期后应用访问GCP服务会直接报权限错误,无法自动续期,完全不适合长时间运行的生产服务。
- GCP官方推荐的规范做法是直接使用官方认证库加载WIF配置生成可自动刷新的凭证,不需要手动获取、导出令牌。
问题2解答:官方WIF令牌自动刷新能力支持说明
- GCP官方Java认证库完全支持WIF令牌的自动按需刷新,并且可以原生对接
com.google.api.gax.core.CredentialsProvider接口,不需要你自行实现刷新逻辑。 - 有两种实现方式可选:
方式一:使用官方原生ExternalAccountCredentials(推荐)
官方提供的ExternalAccountCredentials类会自动处理令牌过期判断、调用STS接口换取新令牌,你只需要配置WIF相关参数即可。
- 首先引入官方认证依赖(如果是Quarkus项目,quarkus-gcp扩展已经默认传递引入,无需额外添加)
<dependency> <groupId>com.google.auth</groupId> <artifactId>google-auth-library-oauth2-http</artifactId> <version>最新稳定版本</version> </dependency>
- 构造WIF配置,支持两种配置方式:
- 把配置写入JSON文件,通过文件路径加载
- 直接在代码中构造配置串加载,示例如下:
import com.google.auth.oauth2.ExternalAccountCredentials; import com.google.api.gax.core.FixedCredentialsProvider; import com.google.api.gax.core.CredentialsProvider; import java.io.ByteArrayInputStream; // 替换成你自己的实际参数 String wifConfig = "{\n" + " \"type\": \"external_account\",\n" + " \"audience\": \"//iam.googleapis.com/projects/"+gcp.projNum+"/locations/global/workloadIdentityPools/myIdpPool/providers/myIdpApp\",\n" + " \"subject_token_type\": \"urn:ietf:params:oauth:token-type:jwt\",\n" + " \"token_url\": \"https://sts.googleapis.com/v1/token\",\n" + " \"service_account_impersonation_url\": \"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/sa1@projx.iam.gserviceaccount.com:generateAccessToken\",\n" + " \"credential_source\": {\n" + // 这里配置你获取IdP原始令牌的逻辑,官方支持从文件、环境变量、自定义执行命令获取 " \"exec\": {\n" + " \"command\": \"your-custom-command-to-get-idp-token\",\n" + " \"args\": [],\n" + " \"timeout_millis\": 5000\n" + " }\n" + " }\n" + "}"; ExternalAccountCredentials credentials = ExternalAccountCredentials .fromStream(new ByteArrayInputStream(wifConfig.getBytes())); // 直接对接GAX的CredentialsProvider CredentialsProvider provider = FixedCredentialsProvider.create(credentials);
- 把构造好的
CredentialsProvider注入到PubSub客户端的构造逻辑中即可,后续令牌刷新完全由官方库自动处理。
- 如果是Quarkus项目,你可以直接配置
quarkus.google.cloud.credentials.file-path指向你保存的WIF配置JSON文件,Quarkus的GCP扩展会自动加载该凭证,不需要手动写代码构造。
方式二:自定义CredentialsProvider对接你自己的getWif工具
如果你的IdP令牌获取逻辑比较特殊,不想用官方的exec配置,也可以自行实现CredentialsProvider接口,在getCredentials()方法中调用你自己的getWif工具返回最新的令牌,只需要自己加简单的有效期判断,避免每次请求都重新获取令牌即可。
内容的提问来源于stack exchange,提问作者Espresso
相关产品推荐
相关产品推荐

