Firestore 用户管理最佳实践?

Posted

技术标签:

【中文标题】Firestore 用户管理最佳实践?【英文标题】:Firestore User Management Best Practices? 【发布时间】:2019-06-07 22:59:00 【问题描述】:

所以我正在使用 Firestore 和 Nuxt 开发一个 Web 应用程序,在我进行身份验证的同时,我想确保我遵循最佳实践。

使用 Firebase 身份验证只会给我一个标识符(在这种情况下是电子邮件)和一个 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 身份验证绑定在一起?

【问题讨论】:

你可以看看savvyapps.com/blog/… 【参考方案1】:

这个问题引出了另一个问题:处理应用程序状态(包括用户状态)的最佳实践。所以,这实际上是一个很好的问题,并且有一个最佳实践(一个非主观的答案)。下面是基于标准 javascript 的。我不熟悉 vue 或 nuxt 框架。

关于存储用户配置文件数据,最佳做法是在您的数据存储中创建一个users 集合,实际上是在 Firestore(下一代 RTDB 版本)中。使用 firebase.auth().currentUser.uid 作为每个用户记录(或 document,Firestore 术语)的文档 ID/名称。 firebase.auth().currentUser 对象通过 .onAuthStateChanged 观察者填充。因此,例如,您会说firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid).update(age:25) 来保存用户的年龄。

虽然没有完成。

您不希望每次需要读取用户配置文件数据时都查询数据存储。因此,您所做的是在登录时将实时侦听器 (.onSnapshot) 附加到用户文档。有一个名为userDocument 的应用程序级/全局变量并执行userDocument = userDocuserDoc 是您实时更新返回给您的对象。

现在您要做的就是读取本地 userDocument 变量(立即,没有获取延迟)。这种方法也是购物车(文档)等其他数据的最佳实践。

所以,答案是两部分:用户个人资料数据,例如年龄、喜欢的颜色、购物车 ID 等,存储​​在 users 集合中 firebase.auth() 提供的 uid 下。然后,最后,订阅该用户文档,以便在对其进行任何更改时,您的应用(脚本)会立即使用所有数据刷新(而不是按需获取)。

【讨论】:

这仍然是 2021 年的最佳做法吗?如果是这样,你能提供一个代码示例吗?如果有帮助,我正在使用 Nuxt/Vue。感谢有趣的观点!【参考方案2】:

更常规的方法是使用 UID 作为文档的 ID。这让您只需说出以下内容即可找到文档:

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

这比必须进行查询和必须执行有限制的查询要容易。当你现在拥有的时候,如果“用户”意外地获得了两个特定 uid 的文档会发生什么?

【讨论】:

以上是关于Firestore 用户管理最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

保护特权用户帐户的九个最佳实践

Zabbix最佳实践二:快速入门

PubNub 最佳实践:如何管理私人房间?

事务管理最佳实践全面解析

如何管理用户数据

将登录用户的角色存储在 vuex 安全/最佳实践中吗?