Мне, должно быть, здесь не хватает чего-то действительно базового ... но каждый раз, когда я звоню в свою базу данных Cloud Firestore и пытаюсь установить какие-либо правила безопасности, они всегда терпят неудачу.
Делать что-то вроде
match /users/{userId} {
allow create, read, update: if true;
}
работает, но, очевидно, побеждает суть. Тем не менее, если я проведу какую-либо дополнительную проверку, такую как переход к примеру во всех документах, например
match /users/{userId} {
allow create, read, update: if request.auth.uid != null;
}
он терпит неудачу каждый раз. Я упускаю что-то очевидное в том, как я соединяю свой код на стороне клиента?
Вот мой код на стороне клиента, который регистрирует пользователя, а затем делает вызов БД, чтобы захватить пользователя.
(Обратите внимание, что в моей базе данных ключи для пользователей по электронной почте, а не по uid)
// this is a snippet from the code where I log the user in
firebase.auth().signInWithEmailAndPassword(email, FIREBASE_USER_PASSWORD)
.then(user => {
// the user comes back successfully logged in,
// I grab its uid and add it to a preparedUser object that I've been building,
// then pass this user to my getFirestoreUserObject function
preparedUser.uid = user.uid;
getFirestoreUserObject({dispatch, user: preparedUser, navigate});
})
// then the getFirestoreUserObject function:
// note that all the code below works fine when there are no security rules in place
const getFirestoreUserObject = ({dispatch, user, navigate}) => {
const {name, email, imageUrl} = user;
// if I ask for currentUser here, I get back my logged in user
const currentUser = firebase.auth().currentUser;
// email is defined correctly here as the user's email
firebase.firestore().collection('users').doc(`${email}`)
.get() // the request fails here due to insufficient permissions
.then(doc => {
if (doc.exists) {
const currentUser = doc.data();
getUserFavorites({dispatch, currentUser, navigate});
} else {
createUserInFirestore({dispatch, user, navigate});
}
})
};
Есть ли что-то очевидное, чего мне не хватает? Если я войду в систему через firebase.auth()
, а затем сразу после вызова firebase.firestore()
, разве это не должно иметь контекст аутентифицированного пользователя? Если нет, как я могу передать его в пожарный?
Спасибо!