Подтвердить что ты не робот

Аутентификация API Google API в Java без использования переменной окружения

Я установил простое тестовое приложение для взаимодействия с Google API естественного языка. я создал учетную запись службы и загрузил учетные данные JSON. Я запускаю локальную машину разработки, поэтому я устанавливаю переменную среды GOOGLE_APPLICATION_CREDENTIALS, указывающую на файл JSON. Чтобы быть ясным, это работает: приложение успешно выполняет некоторые вызовы API и отображает результаты.

Я хотел бы удалить зависимость от переменной окружения. Как я могу использовать известное расположение файла JSON (или любого другого подхода) в приложении для создания LanguageServiceClient с этими учетными данными?

4b9b3361

Ответ 1

Вы можете зарегистрироваться так:

DatastoreOptions options = DatastoreOptions.newBuilder()
  .setProjectId(PROJECT_ID)
  .setAuthCredentials(AuthCredentials.createForJson(
    new FileInputStream(PATH_TO_JSON_KEY))).build();

Помогает ли это?

Ответ 2

Мы используем учетную запись службы + GoogleCredential.Builder - (обратите внимание, что в этом примере используется файл учетных данных в формате p12); пример:

 private GoogleCredential authorize() throws IOException, GeneralSecurityException
{
    return new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(serviceAccount)
    .setServiceAccountScopes(SCOPES)
    .setServiceAccountUser(serviceAccountUser)
    // variable p12File is a String w/ path to the .p12 file name
    .setServiceAccountPrivateKeyFromP12File(new java.io.File(p12File))
      .build();
}

Ответ 3

Это выглядит как более старая нить, но поделится нашими результатами тем, что стоит.

Этот пример предназначен для Google ImageAnnotatorClient, но я уверен, что он очень похож на LanguageServiceClient.

Библиотеки в старой школе (эпоха P12) используют GoogleCredential против новых GoogleCredentials. Они выглядят очень похожими. Копая в иерархию Типа, я нашел FixedCredentialsProvider, который, кажется, делает трюк.

Это сработало для нас, мы получили API Google Vision и работаем с существующим файлом P12 без переменной окружения. Это похоже на то, что Google хочет, чтобы мы ушли от него, поэтому не рекомендуем этот подход долговременно.

// old-school Google Authentication
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();

// Spring code
String pemFile = "yourPemFile.p12";
Resource r = new ClassPathResource(pemFile);
String serviceAccountEmail = "[email protected]";

// com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder
Builder credentialBuilder = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountId(serviceAccountEmail)
            .setServiceAccountPrivateKeyFromP12File(r.getFile());

// Cloud API endpoints, make sure that the API is enabled
Collection<String> scopes = Collections.singleton("https://www.googleapis.com/auth/cloud-vision");
GoogleCredential credential = credentialBuilder
            .setServiceAccountScopes(scopes).build();

// copy over key values, note the additional "s", set some expiry
// com.google.auth.oauth2.GoogleCredentials 
GoogleCredentials sac = ServiceAccountCredentials.newBuilder()
            .setPrivateKey(gc.getServiceAccountPrivateKey())
            .setPrivateKeyId(gc.getServiceAccountPrivateKeyId())
            .setClientEmail(gc.getServiceAccountId())
            .setScopes(scopes)
            .setAccessToken(new AccessToken(gc.getAccessToken(), new LocalDate().plusYears(1).toDate()))
            .build();

// Latest generation Google libs, GoogleCredentials extends Credentials
CredentialsProvider cp = FixedCredentialsProvider.create(sac);
ImageAnnotatorSettings settings = ImageAnnotatorSettings.newBuilder().setCredentialsProvider(cp).build();
ImageAnnotatorClient googleApi = ImageAnnotatorClient.create(settings);

Ответ 4

Следуя рекомендациям tokyohans, отвечающим выше, я могу подтвердить, что это работает для LanguageServiceClient:

    // old-school Google Authentication     
    GoogleCredential credential = null;
    credential = GoogleCredential.fromStream(new FileInputStream("google.json"));

    Collection<String> scopes = Collections.singleton("https://www.googleapis.com/auth/cloud-language");

    if (credential.createScopedRequired()) {
          credential = credential.createScoped(scopes);
    }

    // copy over key values, note the additional "s", set some expiry
    // com.google.auth.oauth2.GoogleCredentials 
    GoogleCredentials sac = ServiceAccountCredentials.newBuilder()
                .setPrivateKey(credential.getServiceAccountPrivateKey())
                .setPrivateKeyId(credential.getServiceAccountPrivateKeyId())
                .setClientEmail(credential.getServiceAccountId())
                .setScopes(scopes)
                .setAccessToken(new AccessToken(credential.getAccessToken(), new LocalDate().plusYears(1).toDate()))
                .build();

    // Latest generation Google libs, GoogleCredentials extends Credentials
    CredentialsProvider cp = FixedCredentialsProvider.create(sac);
    LanguageServiceSettings settings = (LanguageServiceSettings) LanguageServiceSettings.newBuilder().setCredentialsProvider(cp).build();
    return LanguageServiceClient.create(settings);