Как создать объект GoogleCredential со ссылкой на файл json учетной записи службы в потоке данных? - PullRequest
0 голосов
/ 30 апреля 2018

Я написал конвейер для извлечения журналов активности комплекта G, сославшись на java-quickstart комплекта , где код читает файл client_secret.json, как показано ниже,

InputStream in = new FileInputStream("D://mypath/client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

Конвейер работает должным образом в локальном режиме (runner = DirectRunner), но тот же код завершается ошибкой с исключением из java.io.FileNotFoundException при выполнении в облаке (runner = DataflowRunner)

Я понимаю, что локальный путь недействителен при выполнении в облаке. Любое предложение здесь?

Изменено:

Я изменил код, как показано ниже, и могу прочитать файл client_secrets.json

    InputStream in =
    Activities.class.getResourceAsStream("client_secret.json");

Актуальная проблема заключается в создании объекта учетных данных

private static   java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"),
         ".credentials/admin-reports_v1-java-quickstart");
private static final List<String> SCOPES = Arrays.asList(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY);

static {
    try {
        HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
    } catch (Throwable t) {
        t.printStackTrace();
        System.exit(1);
    }
}

public static Credential authorize() throws IOException {
    // Load client secrets.
    InputStream in =
    Activities.class.getResourceAsStream("client_secret.json");

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
            clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY).setAccessType("offline").build();
    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
    return credential;
}

Замечания:

Локальное исполнение:

  1. При первоначальном выполнении программа пытается открыть браузер для авторизации запроса и сохраняет аутентифицированный объект в файле - «StoredCredential».
  2. При последующих выполнениях сохраненный файл используется для выполнения вызовов API.

Запуск в облаке (DataFlowRunner):

  1. Когда я проверяю логи, поток данных пытается открыть браузер для аутентификации запроса и останавливается там.

Что мне нужно?

Как изменить GoogleAuthorizationCodeFlow.Builder так, чтобы объект учетных данных мог быть создан при работе в качестве конвейера потока данных?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я нашел решение для создания GoogleCredential объекта с использованием учетной записи службы. Ниже приведен код для этого.

    public static Credential authorize() throws IOException, GeneralSecurityException {

        String emailAddress = "service_account.iam.gserviceaccount.com";
        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId(emailAddress)
                .setServiceAccountPrivateKeyFromP12File(Activities.class.getResourceAsStream("MYFILE.p12"))
                .setServiceAccountScopes(Collections.singleton(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY))
                .setServiceAccountUser("USER_NAME")
                .build();

        return credential;
    }
0 голосов
/ 09 мая 2018

Можете ли вы попробовать запустить программу несколько раз локально. Что мне интересно, так это если файл StoredCredential будет доступен, он просто будет работать? Или он попытается снова загрузить браузер?

Если это так, можете ли вы определить подходящее место для хранения этого файла и загрузить его копию из GCS на рабочий поток данных? Должны быть API для загрузки файлов GCS в комплекте с jar потока данных SDK. Таким образом, вы сможете использовать их для загрузки файла учетных данных.

...