Импорт/экспорт Firestore по API

Я ищу способ программно вызвать функциональность импорт/экспорт пожарных из java-кода.

Что я обнаружил до сих пор, так это то, что хороший клиентская библиотека firestore еще не поддерживает вызовы импорта/экспорта. Но более низкий уровень отдых / grpc API их уже поддерживает. Используя Java-библиотека, я попробовал следующее:

Firestore firestoreApi = new Firestore
    .Builder(UrlFetchTransport.getDefaultInstance(), new GsonFactory(), null)
    .setApplicationName(SystemProperty.applicationId.get())
    .build();

GoogleFirestoreAdminV1beta2ImportDocumentsRequest importRequest = new GoogleFirestoreAdminV1beta2ImportDocumentsRequest();
importRequest.setInputUriPrefix(String.format("gs://{}/{}/", BUCKET, image));

GoogleLongrunningOperation operation = firestoreApi
    .projects()
    .databases()
    .importDocuments("projects/" + SystemProperty.applicationId.get() + "/databases/(default)", importRequest)
    .execute();

Что, к сожалению, заканчивается отсутствием разрешений при запуске в движке приложения:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401
{
  "code": 401,
  "errors": [
    {
      "domain": "global",
      "location": "Authorization",
      "locationType": "header",
      "message": "Login Required.",
      "reason": "required"
    }
  ],
  "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
  "status": "UNAUTHENTICATED"

Я не могу заставить официальный путь войти в систему, потому что у построителя firestore нет метода для приема экземпляра AppEngineCredentials.

Я уже проверил клиентскую библиотеку python, которая также не поддерживает эти методы (пока). Кто-нибудь знает, как я могу войти в систему со старым API-интерфейсом или получить клиентскую библиотеку, которая поддерживает эти методы (некоторый язык, который работает на движке приложения, пожалуйста :))

Спасибо за прочтение! Карстен

Вот пример в Node: firebase.google.com/docs/firestore/solutions/schedule-export‌​. Для Java можно адаптировать этот Пример облачного хранилища данных.

Juan Lara 11.04.2019 20:14

@JRLtechwriting Большое спасибо! Использование примера с хранилищем данных сработало! Я думаю, что для учетной записи механизма приложения требуются «Администратор импорта и экспорта облачного хранилища данных» и «Агент службы администратора Firebase Admin SDK». Но это второстепенные детали. Кстати: если вы добавите свой комментарий в качестве ответа, я приму его :)

Carsten Rietz 12.04.2019 08:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
155
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете адаптировать этот Пример облачного хранилища данных для Cloud Firestore. Посмотрите, как они получают токен доступа здесь:

import com.google.appengine.api.appidentity.AppIdentityService;
import com.google.appengine.api.appidentity.AppIdentityServiceFactory;

// Get an access token to authorize export request
      ArrayList<String> scopes = new ArrayList<String>();
      scopes.add("https://www.googleapis.com/auth/datastore");
      final AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
      final AppIdentityService.GetAccessTokenResult accessToken =
          AppIdentityServiceFactory.getAppIdentityService().getAccessToken(scopes);
      connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());

Другие вопросы по теме