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

Java生成服务账号JWT调用GCP CloudFunction返回403问题排查

问题分析与修复方案

核心错误:混淆ID Token与Access Token

你的代码里存在关键逻辑错误:IdTokenCredentials的作用是生成ID Token(Cloud Function调用要求的身份验证凭证),但你却调用getAccessToken().getTokenValue()获取了OAuth2 Access Token——这两种token的用途和验证逻辑完全不同,直接导致Cloud Function返回403。

修正后的代码实现

1. 调整token获取逻辑

将获取token的代码从getAccessToken()改为getIdToken(),同时移除不必要的Options参数(调用Cloud Function不需要FORMAT_FULL和LICENSES_TRUE):

private String getApiToken() {
    IdTokenCredentials tokenCredential =
            IdTokenCredentials.newBuilder()
                    .setIdTokenProvider((IdTokenProvider) googleCredentials)
                    .setTargetAudience(appProperties.videoService().videoGeneratorUrl())
                    .build();
    try {
        tokenCredential.refreshIfExpired();
        // 正确获取ID Token而非Access Token
        return tokenCredential.getIdToken().getTokenValue();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

2. 验证Target Audience的正确性

确保videoGeneratorUrl是Cloud Function的完整触发URL,格式必须为:

https://<REGION>-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>

这个值必须和你使用gcloud auth print-identity-token --audiences=<URL>时指定的URL完全一致,gcloud默认会用Function的完整触发URL作为audience,两者不匹配也会导致验证失败。

额外验证项

  • 确认服务账号的roles/cloudfunctions.invoker权限已直接绑定到目标Cloud Function(虽然项目Owner角色包含该权限,但直接绑定Function权限能避免潜在的权限继承问题)。
  • 检查GOOGLE_APPLICATION_CREDENTIALS指向的服务账号密钥属于正确的GCP项目,且未过期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:13