У меня есть приложение 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();
, где "YYY" - это имя коллекции (Я попытался запустить его как для пустой, так и для непустой коллекции).
После создания приложения я загружаю его в экземпляр 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
, результат был таким же.
Теперь странныйДело в том, что когда я запускаю приложение локально с другой учетной записью службы «Владелец облачного хранилища данных», оно работает нормально.
Что я делаю не так?