reactjs - 使用 localId/idToken(而不是电子邮件/密码)进行 Firebase 身份验证

标签 reactjs firebase redux firebase-authentication

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

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

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

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

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

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

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

我得到“空”。 看来即使我已经有 localId 也必须登录,不登录我就无法访问数据库。

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

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

提前致谢!

最佳答案

您不必将电子邮件和密码存储在本地存储中。 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.
  }
});

关于reactjs - 使用 localId/idToken(而不是电子邮件/密码)进行 Firebase 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53244547/

相关文章:

javascript - Firebase 存储规则经过身份验证的用户的专用 URL(不含 downloadURL 或库)

javascript - 在我单击 UI 之前,signInWithPopup Promise 不会执行 .catch。 Angular 和 Firebase

javascript - 将 Angular 服务注入(inject) Redux Action 创建者

javascript - React + Firebase 应用程序和 auth.esm.js 的网络错误 :255 while trying to sign in with Google

reactjs - 为什么 Redux 将调度传递到操作的返回函数中?

angular - Ngrx Store 在浏览器刷新后重置。如何让应用保持状态?

javascript - Material Ui popover 不在正确的位置

javascript - '+ ((visible && "is-active") || "")' 是一个好的做法吗?

reactjs - 如何让 VSCode 显示文件*未*在编辑器中打开的 TypeScript 错误?

javascript - 数组值的排序以匹配另一个数组 ES6