firebase - 将数据保存到 Firebase 用户对象
问题描述
使用这个:
firebase.auth().onAuthStateChanged(function(user){
if (user){
Firebase
正在返回用户,其中包括userID
. 当网页获取此对象时,它会获取用户 ID,并且需要再次访问数据库记录以检查一些非常基本的内容(如果它是付费用户,或者其他简单的键)以选择 UI。
是否可以在此回调中返回用户,包括一些关于他的预定义基本信息?
解决方案
如果要向用户帐户添加一些额外信息,则不能使用User
具有固定属性列表的对象。
有两种经典方法:
1.创建特定的用户记录
您为每个用户创建一个 Firestore 文档(或一个实时数据库节点)。通常您使用用户的 uid 作为 Firestore 文档/RTDB 节点的 id。
这意味着您将需要获取数据库以获取此额外的用户信息,例如
firebase.auth().onAuthStateChanged(function(user){
if (user) {
firebase.firestore().collection('users').doc(user.uid).get()
.then(...)
}
//...
}
2.使用自定义声明
如果您只需要存储有限数量的额外信息以提供访问控制,您可以使用自定义声明。这特别适用于存储用户角色,例如付费用户。
自定义用户声明可通过用户的身份验证令牌访问,因此您可以使用它们根据用户的角色或访问级别修改客户端 UI。在文档中查看更多详细信息。
要在前端获取声明,您可以执行以下操作:
firebase.auth().onAuthStateChanged(function (user) {
if (user) {
user.getIdTokenResult()
.then((idTokenResult) => {
// Confirm the user is a paid user.
if (!!idTokenResult.claims.paidUser) {
// Show admin UI.
showPaidUserUI();
} else {
// Show regular user UI.
showRegularUI();
}
})
.catch((error) => {
console.log(error);
});
}
//...
}
请务必注意文档中的以下部分:
自定义声明仅用于提供访问控制。它们并非旨在存储其他数据(例如配置文件和其他自定义数据)。虽然这似乎是一种方便的机制,但强烈建议不要这样做,因为这些声明存储在 ID 令牌中,并且可能导致性能问题,因为所有经过身份验证的请求始终包含与登录用户对应的 Firebase ID 令牌。
- 使用自定义声明来存储数据,仅用于控制用户访问。所有其他数据应通过实时数据库或其他服务器端存储单独存储。
- 自定义声明的大小有限。传递大于 1000 字节的自定义声明有效负载将引发错误。
推荐阅读
- javascript - 使用 minikube 部署多页 Web 应用
- matlab - 多次使用 polyval 函数的性能改进
- powershell-2.0 - Sparx Enterprise 架构师使用 powershell 创建基线
- web-services - Google App Engine 上是否有可用于 Node.js 的最流行(微)服务的列表?
- bash - 制作一个 bash 脚本来更新/下载 github 工具
- json - 动态使用带有树的面包屑 SAPUI
- python - 区分消息python3 tcp套接字
- spring - Hadoop HBase 的 Spring
- trustpilot - 在开发环境中没有来自api的响应,但在生产环境中工作
- java - 泽西依赖项中的冲突