У меня есть приложение Java, использующее firebase-admin, которое я пытаюсь заставить наблюдать за коллекцией в Firestore и действовать в соответствии с ее изменениями.

У меня такой код:

final GoogleCredentials credentials = GoogleCredentials
            .getApplicationDefault();

final FirebaseOptions options = new FirebaseOptions.Builder()
            .setCredentials(credentials).setProjectId("XXX")
            .build();

FirebaseApp.initializeApp(options);

Firestore db = FirestoreClient.getFirestore();

Где «XXX» - это проверенный трижды идентификатор моего проекта.

Чуть позже вот это:

final ApiFuture<QuerySnapshot> future = db.collection("YYY").get();
final List<QueryDocumentSnapshot> documents = future.get().getDocuments();

Где «ГГГ» - это имя коллекции (я пробовал запускать ее как для пустой, так и для непустой коллекции).

Создав приложение, я загружаю его в экземпляр Google Compute Engine. Когда я запускаю его, последняя строка вызывает следующую ошибку:

java.util.concurrent.ExecutionException: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scopes.
        at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:500)
        at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:479)
        at com.google.api.core.AbstractApiFuture.get(AbstractApiFuture.java:56)
        at com.dammitchat.App.main(App.java:55)

Я запустил на виртуальной машине следующее:

~$ gcloud auth list
                  Credentialed Accounts
ACTIVE  ACCOUNT
*       XXXXXXXXXXXX-compute@developer.gserviceaccount.com

Я проверил IAM, и эта учетная запись службы имеет роль «Редактор» (на всякий случай я также попытался добавить «Владелец облачного хранилища данных»), поэтому я могу представить, что она может обойти любые правила, которые я установил для своей коллекции. Фактически, для этой коллекции есть правило, которое гласит:

match /YYY/{y} {

    allow read: if false;
}

Но даже когда я изменил его на true, результат был таким же.

Странно то, что когда я запускаю приложение локально с другой учетной записью службы «Владелец хранилища данных в облаке», оно работает нормально.

Что я делаю не так?

2
Adam 24 Сен 2018 в 01:39

1 ответ

Лучший ответ

Он гласит:

Запрос имеет недостаточные области проверки подлинности.

Для RPC одной из этих областей oAuth2 необходимо запросить:

Аутентификация учетной записи службы объясняется здесь (на это указывает сообщение об ошибке ).

Правила безопасности (которые не являются причиной этого сообщения об ошибке) см. здесь < / а>.

Также см. Cloud Firestore API и Java пример.

2
Martin Zeitler 23 Сен 2018 в 23:34