【问题标题】:Firebase retrieve the user data stored in local storage as firebase:authUser:Firebase 以 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
});

【问题讨论】:

    标签: javascript angularjs ionic-framework firebase firebase-authentication


    【解决方案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;
    

    【讨论】:

    【解决方案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 进行检查:stackoverflow.com/a/67046722/271450
    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2017-05-28
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多