You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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相关参数即可。

  1. 首先引入官方认证依赖(如果是Quarkus项目,quarkus-gcp扩展已经默认传递引入,无需额外添加)
<dependency>
  <groupId>com.google.auth</groupId>
  <artifactId>google-auth-library-oauth2-http</artifactId>
  <version>最新稳定版本</version>
</dependency>
  1. 构造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);
  1. 把构造好的CredentialsProvider注入到PubSub客户端的构造逻辑中即可,后续令牌刷新完全由官方库自动处理。
  • 如果是Quarkus项目,你可以直接配置quarkus.google.cloud.credentials.file-path指向你保存的WIF配置JSON文件,Quarkus的GCP扩展会自动加载该凭证,不需要手动写代码构造。

方式二:自定义CredentialsProvider对接你自己的getWif工具

如果你的IdP令牌获取逻辑比较特殊,不想用官方的exec配置,也可以自行实现CredentialsProvider接口,在getCredentials()方法中调用你自己的getWif工具返回最新的令牌,只需要自己加简单的有效期判断,避免每次请求都重新获取令牌即可。

内容的提问来源于stack exchange,提问作者Espresso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:24:04