Задание на вставку Bigquery с учетной записью службы по умолчанию - PullRequest
0 голосов
/ 07 октября 2019

У меня был некоторый рабочий код для использования остальных API, загрузите файлы в bigquery, как описано https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/insert Во время процесса я использовал ServiceAccountCredentials, чтобы прочитать закрытый ключ и gendrate токен JWT, а затем, наконец, получить токен OAuth длявставить работу. Теперь тот же процесс, который мне нужно будет запустить в контейнере Docker внутри GCP. Я не нашел клиента для этого. По этой причине я впервые выбрал Rest API. Можно ли сгенерировать токен, используя учетные данные учетной записи службы по умолчанию? Как я могу получить учетную запись службы по умолчанию в коде Java?

1 Ответ

0 голосов
/ 07 октября 2019

В вашем вопросе не указано, в каком сервисе работает контейнер. Некоторые сервисы делают учетные данные приложения по умолчанию (ADC) доступными для контейнера через сервер метаданных или через секреты, другие - нет. Для тех служб, которые не предоставляют ADC, вам потребуется указать файл ключа учетной записи службы.

В этом ответе я покажу вам правильный способ получения Google OAuth Access Token. Если у вас нет особых технических причин, не создавайте токены из 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, которая поддерживает сервер метаданных (Compute Engine и т. д.), вы можете получить AccessТокен по HTTP GET Запрос к этой конечной точке:

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

Вам потребуется включить этот заголовок HTTP в запрос GET:

Metadata-Flavor: Google
...