Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有默认服务帐户的Bigquery插入作业_Java_Google Cloud Platform_Google Bigquery_Google Oauth_Service Accounts - Fatal编程技术网

Java 具有默认服务帐户的Bigquery插入作业

Java 具有默认服务帐户的Bigquery插入作业,java,google-cloud-platform,google-bigquery,google-oauth,service-accounts,Java,Google Cloud Platform,Google Bigquery,Google Oauth,Service Accounts,我有一些工作代码可以使用RESTAPI将文件加载到bigquery中,如前所述 在这个过程中,我使用ServiceAccountCredentials读取私钥和gendrate JWT令牌,然后最终获得用于插入作业的OAuth令牌。 现在,我需要在gcp中的docker容器中运行相同的过程。我没有找到客户这样做。这就是我第一次去休息的原因。是否有一种方法可以使用默认服务帐户的凭据生成令牌?如何访问java代码中的默认服务帐户?您的问题没有说明容器运行在哪个服务中。一些服务通过元数据服务器或机密使

我有一些工作代码可以使用RESTAPI将文件加载到bigquery中,如前所述 在这个过程中,我使用ServiceAccountCredentials读取私钥和gendrate JWT令牌,然后最终获得用于插入作业的OAuth令牌。
现在,我需要在gcp中的docker容器中运行相同的过程。我没有找到客户这样做。这就是我第一次去休息的原因。是否有一种方法可以使用默认服务帐户的凭据生成令牌?如何访问java代码中的默认服务帐户?

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

对于这个答案,我将向您展示获取GoogleOAuth访问令牌的正确方法。除非您有特定的技术原因,否则不要从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();
如果您在支持元数据服务器(计算引擎等)的Google服务上运行,则可以通过对该端点的HTTP GET请求获取访问令牌:

http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
您需要在GET请求中包含此HTTP标头:

Metadata-Flavor: Google

谢谢你,约翰。这有助于解决一个lotOne问题,即从具有ADC的容器运行访问令牌或在本地运行代码是否重要。你展示的方式要简单得多。我过去常常发送请求以获取访问令牌。这更复杂。那只是因为我当时才发现了这一点。如果没有限制此代码从容器中运行,并且设置了ADC或类似于我的本地计算机的位置,则将大大简化此过程。您的本地系统将无法访问元数据服务器。如果在本地系统上设置应用程序默认凭据,则可以在本地访问ADC。我写了一篇关于ADC的文章:也请阅读这篇文章:如果你浏览我的网站,你会发现很多帮助你理解谷歌云的文章。