Подключиться к Cloud Firestore в режиме DataStore от Java - PullRequest
2 голосов
/ 15 марта 2020

Я мигрирую микросервис Java, работающий на App Engine, из DataStore в Cloud Firestore в режиме Datastore и испытываю проблемы с подключением к новой базе данных. Я нахожу документацию запутанной, но работаю на следующей основе (цитата из this )

Настройка разрешений базы данных По умолчанию ваше приложение имеет все разрешения, необходимые для чтения и записи в режим хранилища данных и базы данных Firestore в вашем проекте Google Cloud.

Для управления этими разрешениями каждое приложение App Engine использует учетную запись службы по умолчанию, которая предоставляет полный доступ для чтения и записи в режим хранилища данных и базы данных Firestore в том же проекте, что и приложение. Вы можете изменить разрешения учетной записи службы по умолчанию, но ваше приложение может потерять доступ, если вы не назначите роль IAM с необходимыми разрешениями.

Я нашел учетную запись службы по умолчанию в IAM и сгенерировал ключ и использовал следующий код для инициализации FirebaseApp

    InputStream serviceAccount = this.getClass().getResourceAsStream("/toolbox-firebase-adminsdk-jbx2a-31651a7510.json");

    try {
        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("https://toolbox.firebaseio.com")
                .build();
        FirebaseApp.initializeApp(options);

    } catch (IOException e) {
        throw new RuntimeException(e);
    }

Этот код, кажется, выполняется правильно, но когда я пытаюсь получить доступ к базе данных, я получаю следующую ошибку разрешений

> INFO] GCLOUD: com.google.cloud.datastore.DatastoreException: Missing
> or insufficient permissions. [INFO] GCLOUD:   at
> com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.translate(HttpDatastoreRpc.java:128)
> [INFO] GCLOUD:    at
> com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.translate(HttpDatastoreRpc.java:113)
> [INFO] GCLOUD:    at
> com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.lookup(HttpDatastoreRpc.java:163)
> [INFO] GCLOUD:    at
> com.google.cloud.datastore.DatastoreImpl$3.call(DatastoreImpl.java:392)
> [INFO] GCLOUD:    at
> com.google.cloud.datastore.DatastoreImpl$3.call(DatastoreImpl.java:389)
> [INFO] GCLOUD:    at
> com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:105)
> [INFO] GCLOUD:    at
> com.google.cloud.RetryHelper.run(RetryHelper.java:76) [INFO

Учетная запись службы что я использую имеет следующие разрешения

  • Владелец облачного хранилища данных
  • Пользователь облачного хранилища данных
  • Редактор

Любая помощь в исправлении этого с благодарностью.

1 Ответ

0 голосов
/ 15 марта 2020

Стандартная учетная запись службы App Engine по умолчанию:

gcloud iam service-accounts list | grep appspot.gserviceaccount.com
App Engine default service account   your-project@appspot.gserviceaccount.com 

Эта учетная запись службы уже имеет роль редактора и your app has all the permissions required to read and write to Datastore mode and Firestore databases in your Google Cloud project.

Поэтому вам не нужно создавать ключ. json и инициализируйте свои учетные данные из этого файла.

Для Стандарт App Engine

Если ваше приложение работает в стандартной среде App Engine, вы можете используйте API идентификации приложений App Engine для получения учетных данных.

После настройки учетной записи службы AD C может неявно находить ваши учетные данные без необходимости изменения кода, как описано в разделе выше . Если вы хотите специально использовать учетные данные App Engine, вы можете сделать это явно, как показано в следующем примере кода.

EDIT

Если ваш код работает в Firebase App, а не в App Engine Standard, я думаю, вам не следует использовать учетную запись службы App Engine по умолчанию. Вам необходимо создать новую учетную запись службы с ролью Editor и сгенерировать ключ. json file.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...