Firestore Рекомендации по управлению пользователями? - PullRequest
0 голосов
/ 14 января 2019

Итак, я занимаюсь разработкой веб-приложения с использованием Firestore и Nuxt, и хотя у меня работает аутентификация, я хотел бы убедиться, что я следую рекомендациям.

Использование Firebase Authentication дает мне только идентификатор (в данном случае адрес электронной почты) и UID. Затем я создал коллекцию пользователей для хранения дополнительных данных, таких как:

{
  "UID": "6TIupYLKlcOE97b5Fe63uinf6Ik1",
  "app_metadata": {
    "role": "admin",
    "status": "approved"
  },
  "firstName": "Jon",
  "lastName": "Doe"
}

В настоящее время я выполняю следующие действия после аутентификации пользователя для получения роли пользователя:

// Getting user details
db.collection('users')
.where('UID', '==', user.uid)
.limit(1)
.get()
.then((snapshot) => {
  snapshot.forEach(doc => {
    console.log(doc.id, '=>', doc.data().app_metadata.role)
    dispatch('setROLE', doc.data().app_metadata.role)
  })
})
.catch((err) => {
  console.log('Error getting documents', err);
})

Есть ли лучший способ обработать хранение дополнительных пользовательских данных и связать их все вместе с Аутентификацией Firebase?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Этот вопрос приводит к другому вопросу: лучшая практика для обработки состояния приложения (которое включает в себя состояние пользователя). Так что, на самом деле, это отличный вопрос, и есть лучшая практика (непродуманный ответ). Ниже основан на стандартном JavaScript. Я не знаком с фреймами vue или nuxt.

Что касается хранения данных профиля пользователя, рекомендуется создать коллекцию users в вашем хранилище данных, практически в Firestore (версия RTDB следующего поколения). Используйте firebase.auth().currentUser.uid в качестве идентификатора / имени документа для каждой записи пользователя (или document в жаргоне Firestore). Объект firebase.auth().currentUser заполняется с помощью наблюдателя .onAuthStateChanged. Таким образом, вы можете сказать firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid).update({age:25}), чтобы сохранить возраст пользователей, например.

Не сделано, хотя.

Вам не нужно запрашивать хранилище данных каждый раз, когда вам нужно прочитать данные профиля пользователя. Итак, что вы делаете, это присоединяете слушателя в реальном времени (.onSnapshot) к документу пользователя при входе. Иметь переменную уровня приложения / глобальную с именем userDocument и делать userDocument = userDoc. userDoc - объект, возвращаемый вам вашим обновлением в реальном времени.

Теперь все, что вам нужно сделать, это прочитать локальную переменную userDocument (мгновенно, без задержки выборки). Этот подход лучше всего подходит для других данных, таких как корзины покупок (документы).

Таким образом, ответ состоит из 2 частей: данные профиля пользователя, такие как возраст, любимый цвет, идентификатор корзины и т. Д., Хранятся в коллекции users под идентификатором пользователя, предоставленным firebase.auth(). Затем, наконец, подпишитесь на этот пользовательский документ, чтобы при любых изменениях в нем ваше приложение (скрипт) немедленно обновлялось со всеми этими данными (вместо выборки по требованию).

0 голосов
/ 14 января 2019

Более обычным способом является использование UID в качестве идентификатора документа. Это позволяет вам найти документ, просто сказав:

db.collection('users').doc(uid).get()   // either 0 or 1 document

Это проще, чем выполнять запрос и выполнять запрос с ограничением. Когда то, что у вас есть сейчас, что произойдет, если «пользователи» случайно получат два документа для определенного uid?

...