AngularFire2, похоже, обрабатывает разрешения иначе, чем чистый firebase sdk.
Действия по воспроизведению этой проблемы:
- Вход в учетную запись пользователя
- Выполнение вызовачтобы получить документ пожарного хранилища для пользователя:
return this.afStore.doc('users/' + authId).valueChanges()
.pipe(map(u => {
if (u) {
return new User(u);
}
return null;
})
);
- Выйдите из этой учетной записи пользователя и затем войдите в другую учетную запись пользователя
- Сделайте тот же вызовполучить документ пожарного хранилища для нового пользователя
- На этот раз возвращается
Missing or insufficient permissions
ошибка
Если я добавлю код для firebase непосредственно в мой файл index.html
, он работает, хотя:
var email = "xxx@xxx.com";
var password = "xxx";
var firebaseConfig = {...};
firebase.initializeApp(firebaseConfig);
firebase.auth().onAuthStateChanged((u) => {
if (u) {
firebase.firestore().doc('users/' + u.uid).get()
.then(u => console.log("Got favorites", u.data()));
firebase.firestore().doc('favorites/' + u.uid).get()
.then(u => console.log("Got favorites", u.data()));
}
});
firebase.auth().signInWithEmailAndPassword(email, password).then(cred => {
console.log("Signed in", cred)
})
Мои правила Firebase следующие, но они кажутся в симуляторе нормальными и, очевидно, иногда работают с интерфейсом:
service cloud.firestore {
match /databases/{database}/documents {
function internalGetUserFromReq() {
return get(/databases/$(database)/documents/users/$(request.auth.uid))
}
//...
match /users/{userID} {
allow read, write: if internalGetUserFromReq().data.authId == userID;
allow read, write: if internalGetUserFromReq().data.role == 0;
}
}