Я применяю это правило безопасности к документу администратора пожарного магазина, чтобы я мог проверить, является ли пользователь действительным администратором:
match /admin/identity {
allow write : if false;
allow read : if request.auth.token.name == resource.data.name;
}
Если пользователь заявляет, что он является администратором, после того, как он аутентифицировал его с помощью телефона илианонимно обновляю профиль FirebaseUser с указанным именем, чтобы объект содержал отображаемое имя, действующее как код восстановления:
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName("ABCDEFJHIJK")
.build();
mUser.updateProfile(profileUpdates)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
//try get document, if success the user is the actual admin, if we get error code ACCESS_DENIED then the code is incorrect, else then another error occured retry.
}
}
});
При попытке запроса request.auth.token.name не содержитлюбые действительные строковые данные, а затем правило отклоняет запрос get () для всех запросов.Симулятор на вкладке безопасности консоли Firestore, кажется, также не содержит имя в полезной нагрузке запроса, которое появляется при телефонной и анонимной аутентификации, в документации ничего нет, насколько мне известно, что ясно говорится, что некоторые поля данных аутентификации принимаются во внимание толькодля некоторых провайдеров аутентификации, но не для других.
Это преднамеренное поведение в firebase или я что-то упустил?Какие альтернативы у меня есть, чтобы выполнить политику восстановления?