使用默认服务帐户的 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
我有一些工作代码可以使用其余代码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