Почему мне отказано в разрешении на хранение данных токенов FCM в Cloud Firestore?

#firebase #flutter #google-cloud-firestore

#firebase #флаттер #google-cloud-firestore

Вопрос:

Ошибка:

 W/Firestore(24623): (21.6.0) [WriteStream]: (798288) Stream closed with status: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}.
W/Firestore(24623): (21.6.0) [Firestore]: Write failed at devicetokens/cIvW6DrG5xnxJOhndbyq: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
E/flutter (24623): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operation.
  

Код Flutter:

       _fcm.getToken().then((deviceToken){
        FirebaseFirestore.instance.collection("devicetokens").add({
          'createdAt': DateTime.now(),
          'platform' : Platform.isIOS ? "iOS" : "Android",
          'token': deviceToken
        });
      });
  

Правила:

 rules_version = '2';
service cloud.firestore {   
    match /databases/{database}/documents {
    match /devicetokens/{document=**} {
      allow read: if false;
      allow write: if true; 
    }
  }
}
  

Используя приведенный выше набор кода, моя цель — получить токен FCM и сохранить его в Firestore. Я помню, что ранее использовал этот синтаксис, и тогда он работал, но, похоже, он не работал должным образом с августовского обновления.

РЕДАКТИРОВАТЬ: — FWIW, я получаю ненулевое количество прочитанных на вкладке «Использование», хотя я вообще не читал из Firestore.

EDIT2: — Попробовал обычное условие тестирования, указанное в начале, и оно все равно не удалось.

ПРАВКА3: — Публикация полного журнала ошибок, на случай, если у кого-то есть какие-либо идеи о том, что происходит:

 E/flutter ( 1788): #0      catchPlatformException (package:cloud_firestore_platform_interface/src/method_channel/utils/exception.dart:17:3)
E/flutter ( 1788): #1      _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter ( 1788): #2      _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 1788): #3      _FutureListener.handleError (dart:async/future_impl.dart:160:20)
E/flutter ( 1788): #4      Future._propagateToListeners.handleError (dart:async/future_impl.dart:708:47)
E/flutter ( 1788): #5      Future._propagateToListeners (dart:async/future_impl.dart:729:24)
E/flutter ( 1788): #6      Future._completeError (dart:async/future_impl.dart:537:5)
E/flutter ( 1788): #7      _AsyncAwaitCompleter.completeError (dart:async-patch/async_patch.dart:47:15)
E/flutter ( 1788): #8      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart)
E/flutter ( 1788): <asynchronous suspension>
E/flutter ( 1788): #9      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12)
E/flutter ( 1788): #10     MethodChannelDocumentReference.set (package:cloud_firestore_platform_interface/src/method_channel/method_channel_document_reference.dart:29:51)
E/flutter ( 1788): #11     DocumentReference.set (package:cloud_firestore/src/document_reference.dart:82:22)
E/flutter ( 1788): #12     CollectionReference.add (package:cloud_firestore/src/collection_reference.dart:45:23)
E/flutter ( 1788): #13     _SlideDrawerState.startTime.<anonymous closure> (package:nawa/widgets/innerdrawer.dart:132:63)
E/flutter ( 1788): #14     _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter ( 1788): #15     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 1788): #16     _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
E/flutter ( 1788): #17     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
E/flutter ( 1788): #18     Future._propagateToListeners (dart:async/future_impl.dart:725:32)
E/flutter ( 1788): #19     Future._completeWithValue (dart:async/future_impl.dart:529:5)
E/flutter ( 1788): #20     _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
E/flutter ( 1788): #21     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
E/flutter ( 1788): #22     FirebaseMessaging.getToken (package:firebase_messaging/firebase_messaging.dart)
E/flutter ( 1788): #23     _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter ( 1788): #24     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 1788): #25     _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
E/flutter ( 1788): #26     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
E/flutter ( 1788): #27     Future._propagateToListeners (dart:async/future_impl.dart:725:32)
E/flutter ( 1788): #28     Future._completeWithValue (dart:async/future_impl.dart:529:5)
E/flutter ( 1788): #29     _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
E/flutter ( 1788): #30     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
E/flutter ( 1788): #31     MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart)
E/flutter ( 1788): #32     _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter ( 1788): #33     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 1788): #34     _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
E/flutter ( 1788): #35     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
E/flutter ( 1788): #36     Future._propagateToListeners (dart:async/future_impl.dart:725:32)
E/flutter ( 1788): #37     Future._completeWithValue (dart:async/future_impl.dart:529:5)
E/flutter ( 1788): #38     Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:567:7)
E/flutter ( 1788): #39     _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 1788): #40     _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 1788): #41     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 1788): #42     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter ( 1788): #43     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter ( 1788): #44     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
  

Комментарии:

1. Что вы подразумеваете под «августовским обновлением»?

2. Разве в середине августа не было большого обновления для целого ряда продуктов Firebase? Или это была просто интеграция Firebase-Flutter?

Ответ №1:

Я не уверен, что ваш синтаксис правильный. Кроме того, если для пути сбора документов не настроено правило, и ваша БД не находится в тестовом режиме (т.Е. Вы можете читать / записывать любой путь), операция завершится с PERMISSION_DENIED ошибкой

 rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
     match /devicetokens/{deviceTokenId}  {
      allow read;
      allow write;
    }
  }
}
  

Подстановочные знаки представлены {} не =** так, как у вас ниже

 match /devicetokens/{document=**} {
  allow read: if false;
  allow write: if true; 
}
  

Если все остальное не работает, замените все свои правила следующим фрагментом:

 rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if
          request.time < timestamp.date(2020, 10, 01); //Allow only until the 1st of October
    }
  }
}
  

Он переводит все в тестовый режим (чтение / запись в любом месте из чего угодно). Если ваша ошибка все еще возникает, то это определенно проблема в другом месте

Комментарии:

1. Не могли бы вы уточнить, где синтаксис неверен? Это в коде flutter или в правилах?

2. @FarhanNawaz в ваших правилах мой первый фрагмент кода такой, каким он должен быть. Второе — это то, что у вас есть в настоящее время.

3. Я исправил это (Франческо ранее тоже предлагал это), но это тоже не сработало.

4. @FarhanNawaz Извиняюсь, я забыл разрешение на запись. Попробуйте еще раз с помощью просто allow write;

5. Я попытался выполнить условия тестирования, но все равно не удалось:/.

Ответ №2:

Я бы попробовал следующее:

 rules_version = '2';
service cloud.firestore {   
    match /databases/{database}/documents {
      match /devicetokens/{deviceTokenId} {
        allow read: if false;
        allow write: if true; 
      }
    }
}
  

Комментарии:

1. К сожалению, у меня нет других идей.. Вы уверены, что нет ничего неправильного и что правила были правильно развернуты / активированы?

2. Да. Просто небольшой вопрос, должен ли я пройти весь процесс инициализации будущего, обернутого вокруг MainApp?

3. Я так не думаю.