使用默认服务帐户的 Bigquery 插入作业

Bigquery insert job with default service account

我有一些工作代码可以使用其余代码api按照描述将文件加载到 bigquery https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/insert 在此过程中,我使用 ServiceAccountCredentials 读取私钥并生成 JWT 令牌,然后最终获得用于插入作业的 OAuth 令牌。 现在我需要在 gcp 的 docker 容器中 运行 进行相同的处理。我没有找到客户这样做。这就是我第一时间去休息 API 的原因。有没有一种方法可以使用默认服务帐户的凭据生成令牌?如何在 java 代码中访问默认服务帐户?

您的问题没有说明容器 运行 在什么服务中。一些服务通过元数据服务器或秘密使应用程序默认凭据 (ADC) 可用于容器,而其他服务则不然。对于那些不提供 ADC 的服务,您将需要指定服务帐户密钥文件。

对于这个答案,我将向您展示获取 Google OAuth 访问令牌的正确方法。除非您有特定的技术原因,否则不要从 JWT 创建令牌。

从服务帐户 JSON 密钥文件中获取访问令牌:

import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.AccessToken;
import  com.google.common.collect.Lists;

import java.io.FileInputStream;
import java.io.IOException;

class Main
{
    public static void main(String args[])
    {
    String  sa_file = "/fullpath/serviceaccount.json";
    String  scopes = "https://www.googleapis.com/auth/cloud-platform";

        GoogleCredentials credentials;

        try {
            credentials = GoogleCredentials.fromStream(new FileInputStream(sa_file))
                .createScoped(Lists.newArrayList(scopes));
        }
        catch (java.io.FileNotFoundException e) {
            System.out.println("FileNotFoundException");
            return;
        }
        catch (IOException e) {
            System.out.println("IOException");
            return;
        }

        try {
            AccessToken accessToken;

            accessToken = credentials.getAccessToken();

            if (accessToken == null) {
                accessToken = credentials.refreshAccessToken();
            }

            if (accessToken != null) {
                System.out.println("Access Token: " + accessToken.getTokenValue());
            }
        }
        catch (IOException e) {
            System.out.println("IOException");
            return;
        }
    }
}

如果应用程序默认凭据在您的容器中可用,您可以通过这种方式获取凭据并使用上述方法提取访问令牌。

var credential = GoogleCredential.GetApplicationDefault();

如果您 运行 使用支持元数据服务器(Compute Engine 等)的 Google 服务,您可以通过 HTTP GET 请求向此端点获取访问令牌:

http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token

您需要将此 HTTP header 包含在 GET 请求中:

Metadata-Flavor: Google