request.auth.uid, кажется, всегда равен нулю в правилах Cloud Firestore - PullRequest
0 голосов
/ 08 мая 2018

Мне, должно быть, здесь не хватает чего-то действительно базового ... но каждый раз, когда я звоню в свою базу данных 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(), разве это не должно иметь контекст аутентифицированного пользователя? Если нет, как я могу передать его в пожарный?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

После нескольких недель поиска, и firestore, и auth работали независимо, но не вместе ... это было самое простое.

Я был на firebase 4.x, которая была последней из доступных, когда я начинал свой проект. Затем, когда я подошел к добавлению правил аутентификации, последняя опубликованная документация по firebase о том, как выполнять правила БД (на которую я даже не смотрел, когда начинал, но вернулся через несколько месяцев, когда я был готов их реализовать). ) были перечислены с использованием firebase 5.y. Обновил мой package.json, установил npm, и все волшебным образом заработало :(

Надеюсь, что это может помочь кому-то еще ... убедитесь, что вы по крайней мере версии 5!

0 голосов
/ 30 июня 2018

Вы должны использовать firebase.firestore().collection('users').doc(`${currentUser.uid}`).get() вместо firebase.firestore().collection('users').doc(`${email}`).get().

Это потому, что ваши правила безопасности

match /users/{userId} {
  allow create, read, update: if request.auth.uid != null;
}

проверка идентификатора пользователя при определении, предоставлять ли пользователю доступ к данным, а не к электронной почте пользователя.

Надеюсь, это помогло.

...