【问题标题】:Firebase authentication with localId / idToken (instead of email / password)使用 localId / idToken 进行 Firebase 身份验证(而不是电子邮件/密码)
【发布时间】:2018-11-10 23:47:47
【问题描述】:

在我的应用中,当用户登录时,我使用 firebase.auth 根据用户输入的电子邮件/密码对用户进行身份验证:

firebase.auth().signInWithEmailAndPassword(userInputs.email.value, userInputs.password.value)

然后我将它分派到 redux 状态,并将接收到的 localId 和 idToken 设置在本地存储上:

localStorage.setItem('token', response.user.qa);
localStorage.setItem('localId', response.user.uid);

当用户关闭应用程序窗口然后稍后重新打开应用程序时,localId 和 idToken 仍然设置在 localstorage 中,但要重新验证我需要提供电子邮件和密码。是否可以使用 localId/idToken 进行身份验证,或者我应该将电子邮件/密码保存在 localStorage 上而不是保存两个令牌?

在检查用户是否通过身份验证时:

var user = firebase.auth().currentUser;
console.log(user);

我得到'null'。 即使我已经有了localId,我似乎也必须登录,不登录我无权访问数据库。

另外,显然我的数据库规则只向经过身份验证的用户授予对数据库的访问权限:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

提前致谢!

【问题讨论】:

  • 您不必在重新加载时重新验证用户身份,令牌会自动持久化,在重新加载时加载,然后刷新。您所要做的就是收听onAuthStateChanged。见firebase.google.com/docs/auth/web/…
  • 但是用户重新进入应用后没有登录。我说的是完全关闭窗口然后重新启动应用程序。我检查了: var user = firebase.auth().currentUser;控制台.log(用户);并收到'null'。不是说要重新登录吗?我确实将令牌存储在 localStorage 中,但无法访问 firebase,因为重新输入时没有经过身份验证的用户再次提前谢谢
  • 请尝试onAuthStateChanged。如果需要刷新令牌,这是一个异步操作,firebase.auth().currentUser 可能无法捕捉到它。在onAuthStateChanged 监听器上仍然对您不起作用,请更新您的问题以显示您尝试过的内容。在这种情况下,了解您在哪个平台(浏览器、手机等)上运行也会有所帮助。
  • 谢谢伙计!我明白了

标签: reactjs firebase redux firebase-authentication


【解决方案1】:

您不必将电子邮件和密码存储在本地存储中。 Firebase 库会自动在本地保留身份验证信息。

您得到null 的原因是您试图使用同步代码获取用户信息。 这意味着您正在尝试在 firebase 库初始化之前获取用户。

firebase.auth().currentUser; // <= synchronous

以下代码异步运行,您可以在firebase库初始化后获取用户。

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 2018-09-03
    • 2014-01-17
    • 1970-01-01
    • 2016-12-13
    • 2019-07-13
    • 1970-01-01
    • 2016-10-13
    相关资源
    最近更新 更多