我有一些工作代码可以使用rest api按照所述将文件加载到bigquery中 https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/insert 在此过程中,我使用ServiceAccountCredentials读取私钥并授权JWT令牌,然后最终获得用于插入作业的OAuth令牌。 现在,我需要在gcp中的docker容器中运行相同的过程。我没有找到这样做的客户。这就是我第一时间选择Rest API的原因。有没有办法使用默认服务帐户的凭据生成令牌?如何在Java代码中访问默认服务帐户?
答案 0 :(得分:0)
您的问题并未说明容器正在运行的服务。某些服务通过元数据服务器或机密使容器可以使用应用程序默认证书(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
您将需要在GET请求中包含此HTTP标头:
Metadata-Flavor: Google