Я тестирую свои правила безопасности firebase firestore и облачные функции локально. В моем тестовом примере я создаю пользователя, а затем снова его обновляю. Однако перед обновлением облачные функции должны были запуститься и создать сопоставление, используемое в правиле безопасности обновления, но, похоже, это не происходит локально.
rules_version = '2';
service cloud.firestore {
function userName() {
return get(/databases/$(database)/documents/uid_to_user_name/$(request.auth.uid))
.data
.userName;
}
match /databases/{database}/documents {
match /user/{userName} {
allow read: if signedIn();
allow create: if signedIn()
&& isValidUser(request.resource.data)
&& request.resource.data.uid == request.auth.uid
&& request.resource.data.name == userName;
allow update: if signedIn()
&& isValidUser(request.resource.data)
&& request.resource.data.name == resource.data.name
&& request.resource.data.name == userName
&& request.resource.data.name == userName();
allow delete: if false;
}
}
}
И у меня есть облачная функция, которая запускаетonWrite для / user / {userName}, который создает поиск uid-> userName в таблице с именем uid_to_user_name. Проблема в том, что когда я использую @firebase/testing
и запускаю firebase emulators:start --only firestore,functions
, создается впечатление, что эти две службы взаимодействуют не полностью. Например, когда я создаю пользователя, он проходит мои правила безопасности, и я также вижу, что триггер onWrite был активирован. Однако, когда я сплю в течение 5 секунд и пытаюсь обновить этого пользователя, правило безопасности не выполняется, потому что сопоставление в uid_to_username
равно undefined
. Любопытно, что в течение этого времени я также сохраняю и извлекаю значение из uid_to_username
из облачной функции, и оно присутствует. Таким образом, кажется, что операции записи облачного пожарного хранилища запускают облачные функции, но записи, выполняемые в облачных функциях, не обновляют эмулятор пожарного хранилища. Есть ли способ настроить это?