为 google 云函数生成不记名令牌 - Java

Generate bearer token for google cloud function - Java

我正在尝试从 java 连接到云功能,例如 https://us-west1-<>.cloudfunctions.net,并且我正在尝试为生成不记名令牌此函数使用代码如下:

String audience = https://<projectname>-<region>-<projectid>.cloudfunctions.net/<myFunction>;

GoogleCredentials credentials = GoogleCredentials
                .getApplicationDefault()
                .createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));

IdTokenCredentials tokenCredential =
                IdTokenCredentials.newBuilder()
                    .setIdTokenProvider((IdTokenProvider) credentials)
                    .setTargetAudience(audience)
                    .build();
        
tokenCredential.refresh();
        
String token = tokenCredential.getIdToken().getTokenValue();

当我运行应用程序生成令牌。但是如果我拿到令牌并将其放在邮递员身上,服务器 returns 一个 401 错误:401 Unauthorized.

如果我在 GCP 云 shell 终端中使用 GCP 命令“gcloud auth print-identity-token”,并在 postman 中使用此令牌,则云函数调用成功。

用于获取凭据的Json文件与此类似:

{
  "type": "service_account",
  "project_id": "<project_id>",
  "private_key_id": "<private_key_id>",
  "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n",
  "client_email": "aaa@<project_id>.iam.gserviceaccount.com",
  "client_id": "<client_id>",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/<principle>"
}

请帮助我弄清楚如何在 java 中生成不记名令牌以调用 google 云函数。

谢谢

当我使用如下正确的观众值时,这个问题得到了解决。

https://function-url/projects/project-id/locations/区域/函数/function-name

在上面的 URI 中,将 function-url、project-id、区域和 function-name 替换为您的值。

以下是工作代码。复制并粘贴它。这就是你想要的堆栈溢出,对吧? ;-)

public String getAccessToken(String audience) throws IOException {
        
        InputStream resource = new ClassPathResource(
                  "gcp/service-account.json").getInputStream();
        
        GoogleCredentials credentials = GoogleCredentials
                 .fromStream(resource)
                 .createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));
        
        credentials.refreshAccessToken();
        
        IdTokenCredentials tokenCredential =
                IdTokenCredentials.newBuilder()
                    .setIdTokenProvider((IdTokenProvider) credentials)
                    .setTargetAudience(audience)
                    .build();
                
        tokenCredential.refresh();
        
        return tokenCredential.getIdToken().getTokenValue();
      }

在上面的代码中,

  1. “gcp/service-account.json”是我的服务帐户 json 文件的路径。它位于我的 spring-boot 项目中的 src/main/resources 文件夹(即类路径)下。
  2. 可能不需要 credentials.refreshAccessToken();tokenCredential.refresh();。我没有尝试删除这些。有时间会试试。

希望对大家有帮助!!由于我找不到太多关于“受众”值的帮助,所以我花了一些时间通过反复试验找出正确的值。