Аутентификация API Google API в Java без использования переменной окружения
Я установил простое тестовое приложение для взаимодействия с Google API естественного языка. я создал учетную запись службы и загрузил учетные данные JSON. Я запускаю локальную машину разработки, поэтому я устанавливаю переменную среды GOOGLE_APPLICATION_CREDENTIALS
, указывающую на файл JSON. Чтобы быть ясным, это работает: приложение успешно выполняет некоторые вызовы API и отображает результаты.
Я хотел бы удалить зависимость от переменной окружения. Как я могу использовать известное расположение файла JSON (или любого другого подхода) в приложении для создания LanguageServiceClient
с этими учетными данными?
Ответы
Ответ 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);