Почему имя маркера авторизации Firestore Security Rules всегда пустое? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь сравнить request.auth.token.name с именем документа в Правилах безопасности Firestore, чтобы дать только пользователю доступ к его указанному c документу. К сожалению, это все еще не работает. Я попробовал немного, и кажется, что имя пустое. Но почему? Кто-нибудь может иметь отношение или иметь ответ на этот вопрос?

Проблема:

W/Firestore(30226): (21.3.0) [Firestore]: Write failed at users/johndoe: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}

Правило безопасности:

match /users/{username} {
  allow create: if true;
  allow update: if request.auth.token.name == username;
  allow read: if true;

Код клиента (написано в Dart для Flutter ):

@override
  Future<void> uploadProfileData(ProfileSetupDataModel data) async {
    // Checks if username is already in use and creates a document (works perfectly)
    final userDocReference = await _createDocIfUsernameAvailable(data.username);
    // Here the username is saved in the display name of the FirebaseUser
    await _saveUsernameInAuthUser(data.username);
    // Write all the other information into the user document
    await _fillProfileInformation(userDocReference, data); // -> here the problem occurs
  }


Future<void> _saveUsernameInAuthUser(String username) async {
    try {
      final user = await auth.currentUser();
      final profileUpdate = UserUpdateInfo();
      profileUpdate.displayName = username;
      await user.updateProfile(profileUpdate);
    } catch (e) {
      throw GeneralAuthException();
    }
  }


Future<void> _fillProfileInformation(
      DocumentReference userDocReference, ProfileSetupDataModel data) async {
    try {
      await userDocReference.setData(
        {
          FirestoreUserKeys.birthday: data.birthday,
          FirestoreUserKeys.sex: data.sex,
          FirestoreUserKeys.country: data.country,
          FirestoreUserKeys.storiesCount: 0,
          FirestoreUserKeys.subscribersCount: 0,
          FirestoreUserKeys.subscriptionsCount: 0,
          FirestoreUserKeys.totalLikes: 0,
        },
        merge: true,
      );
    } on PlatformException {
      throw GeneralCloudFirestoreException();
    }
  }
...