Я пытаюсь сравнить 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();
}
}