Firebase 以 firebase:authUser 的形式检索存储在本地存储中的用户数据:

Posted

技术标签:

【中文标题】Firebase 以 firebase:authUser 的形式检索存储在本地存储中的用户数据:【英文标题】:Firebase retrieve the user data stored in local storage as firebase:authUser: 【发布时间】:2016-12-26 09:52:17 【问题描述】:

我正在使用 Firebase 和 AngularJS。我正在使用 Auth 身份验证进行 google 登录,并且我完成了该过程。现在我需要检索存储在本地存储中的用户数据,例如 firebase:authUser:.

一旦我在本地存储中使用 google 帐户登录,您就有了 firebase:authUser:.created,我需要获取这些详细信息。

我使用下面的方法来存储用户数据

firebase.database().ref('users/' + user.uid).set
(
     name: user.displayName,
     email: user.email,
     token: token
);

【问题讨论】:

【参考方案1】:

Web SDK 的文档没有提到在成功进行身份验证后,Firebase 会在 localStorage 中设置 User 对象。 API 参考也没有提到这一点。在尝试使用 Firebase 配置我的 Vue 应用程序时,我通过检查 localStorage 发现了这一点。

要从 localStorage 中检索用户,您可以执行以下操作:

const authUser = Object.keys(window.localStorage)
  .filter(item => item.startsWith('firebase:authUser'))[0]

localStorage 中可能有多个条目,这就是filter() 的原因

编辑:请参阅下面 Metallica 的回答。


更新(2018-02-21):现在似乎有一个部分(Web) Authentication State Persistence 。不确定我最初发布答案时是否存在此问题,但我正在更新此答案以链接它,因为这个问题得到了适度的关注。

更新 2 (2018-02-21):如Overview of persistence behavior 中所述:

如果没有用户登录并且没有指定持久性,则将应用默认设置(浏览器应用中的local)。

所以localStorage 是默认值,它确认了我的原始答案之前 Firebase JS SDK 是开源的。

【讨论】:

我刚刚尝试将身份验证持久性设置为 SESSION,并且用户数据存储到 sessionStorage 而不是 localStorage(这是有道理的)。因此,了解正在使用哪种类型的身份验证持久性(NONE、SESSION、LOCAL)非常重要。赞成票.. 令牌在本地存储时的安全性如何(本地持久性)? @anasqadrei 我认为在这种情况下(会话与本地)安全性并不特别重要,因为您仍然应该验证令牌服务器端的真实性。您的应用程序的使用方式决定了使用哪种存储行为。【参考方案2】:

只是为了增加@Franciso Mateo 的答案:提到的过滤,只是返回序列化用户对象存储在本地存储中的键(字符串)。要获取实际反序列化的用户对象,我们需要从本地存储中读取具有此键的项目:

const userKey = Object.keys(window.localStorage)
  .filter(it => it.startsWith('firebase:authUser'))[0];
const user = userKey ? JSON.parse(localStorage.getItem(userKey)) : undefined;

【讨论】:

请注意,这最近已更改为使用 indexedDB:groups.google.com/forum/#!topic/firebase-talk/wgSvjniKPQI【参考方案3】:

要获取用户的个人资料信息,请使用 User 实例的属性。例如:

var user = firebase.auth().currentUser;
var name, email, photoURL, uid;

    if(user != null) 
       name = user.displayName;
       email = user.email;
       photoUrl = user.photoURL;
       uid = user.uid;
    

如果您想详细了解如何使用 Web SDK 在 Firebase 中管理用户,请访问documentation。

【讨论】:

我已经尝试过了,但它为 currentUser 返回 null。但我发现存储在本地存储中的数据与密钥 firebase:authUser: val 一样,更多说明**请注意,我正在使用 gmail 身份验证并保存之后收到的值* * 有几种方法可以通过 Promise 进行检查:***.com/a/67046722/271450

以上是关于Firebase 以 firebase:authUser 的形式检索存储在本地存储中的用户数据:的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 函数从 Firebase DB 获取数据以进行推送通知

Firebase with Node,“以浏览器为目标的 Firebase 包”

为啥我不能以这种方式将数据添加到 Firebase?

Firebase 以 firebase:authUser 的形式检索存储在本地存储中的用户数据:

Firebase 以管理员身份进行身份验证

如何从 Firebase 获取名称以某个字符串开头的记录?