Firebase检索存储在本地存储中的用户数据作为firebase:authUser:

13

我正在使用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
});
3个回答

16
Web SDK的文档没有提到,Firebase在成功验证后会将 User对象设置在localStorage中。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):如持久性行为概述所述:

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

因此,localStorage是默认设置,这证实了我的原始回答,在Firebase JS SDK开源之前。

我刚刚尝试了将auth persistence设置为SESSION,用户数据存储在sessionStorage中而不是localStorage中(这很有道理)。因此,了解正在使用哪种类型的auth persistences(NONE、SESSION、LOCAL)非常重要。点赞.. - Yogi
当令牌(TOKEN)被本地存储(本地持久性)时,它们有多安全? - anasqadrei
@anasqadrei 我认为在这种情况下(会话 vs 本地存储),安全性并不特别重要,因为您仍然应该在服务器端验证令牌的真实性。您的应用程序预期如何使用决定了使用哪种存储行为。 - Cisco

8

为了补充@Franciso Mateo的答案:上述过滤仅返回保存在本地存储中的序列化用户对象的键(字符串)。要获取实际反序列化的用户对象,我们需要从本地存储中读取此键的项:

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

2
请注意,最近已更改为使用indexedDB:https://groups.google.com/forum/#!topic/firebase-talk/wgSvjniKPQI - dsl101

1
要获取用户的个人资料信息,请使用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中管理用户,请访问文档

2
我已经尝试过这个,但是它返回了null值给currentUser。但是我在本地存储中找到了以**firebase:authUser:val**为键的数据。为了更清楚,请注意我正在使用Gmail身份验证并保存接收到的值。 - Abraham
有几种方法可以通过 Promise 来检查这个问题:https://dev59.com/jVoU5IYBdhLWcg3wCz2X#67046722 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接