【问题标题】:Persist auth state in react/react native for Firebase在 React/React Native for Firebase 中保持身份验证状态
【发布时间】:2021-05-06 19:30:04
【问题描述】:

我将 react native 用于 ios 应用程序并使用 firebase 进行身份验证。每次我离开应用程序并返回时,它都会要求登录。我想保留 firebase 登录,但不知道该放在哪里。

我知道我需要把这个放进去:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL)

我有以下登录功能,当在登录屏幕上按下登录按钮时运行:

const signIn = async () => {
    setLoading(true);
    try {
      await firebase.signIn(email, password);
      const uid = firebase.getCurrentUser().uid;
      const userInfo = await firebase.getUserInfo(uid);
      const emailArr = userInfo.email.split("@");
      setUser({
        username: emailArr[0],
        email: userInfo.email,
        uid,
        isLoggedIn: true,
      });
    } catch (error) {
      alert(error.message);
    } finally {
      isMounted.current && setLoading(false);
    }
  };

我的 firebaseContext 中有以下登录内容:

const Firebase = {
  getCurrentUser: () => {
    return firebase.auth().currentUser;
  },

  signIn: async (email, password) => {
    return firebase.auth().signInWithEmailAndPassword(email, password);
  },

  getUserInfo: async (uid) => {
    try {
      const user = await db.collection("users").doc(uid).get();
      if (user.exists) {
        return user.data();
      }
    } catch (error) {
      console.log("Error @getUserInfo", error);
    }
  },

  logOut: async () => {
    return firebase
      .auth()
      .signOut()
      .then(() => {
        return true;
      })
      .catch((error) => {
        console.log("Error @logout", error);
      });
  },
};

我应该把上面列出的文档中的持久化代码放在哪里?

谢谢!

【问题讨论】:

标签: reactjs firebase react-native firebase-authentication


【解决方案1】:

你什么时候检查某人是否登录?

从显示的代码看来,您可以通过调用currentUser 手动检查它。您必须考虑auth 状态的持久性是异步的。这意味着如果您在本地保存的auth 状态加载之前在身份验证上调用currentUser,您将到达那里null,并且用户未登录。

要获取 auth 状态 Firebase 建议使用 onAuthStateChanges 事件侦听器。有了它,无论您是登录还是加载了持久化auth 状态,您都可以收听身份验证状态的变化。

用法很简单:

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

这就是我问你在哪里检查某人是否登录的原因。如果我能看到该代码,我可以帮助您采用它来使用该事件侦听器。

【讨论】:

  • 我只是邀请你在 github 存储库上进行合作,如果你有时间看看它。
  • 非常感谢您的回复。是的,我读到了,但也不知道放在哪里。这位于私人仓库中,我只是邀请您合作,如果您有时间查看它,我将非常感谢任何关于它放置位置的指导。
  • 您好,我已将更改推送到您的项目。如果你想要一个用于 react 和 firebase 的样板,你可以试试这个:react-most-wanted.com 也许你会很感兴趣。
  • 我正在将该更新推送到我的 ios 应用程序,因为它似乎可以在 Metro 中使用。感谢您的帮助!我对你的 RMW 非常感兴趣。看起来棒极了!我将在我的下一个 React 项目中尝试它。问题:你会对 react native 和 expo 做同样的事情吗?
  • Thx ? 不幸的是,我不会为原生应用程序这样做。 RMW 用于 Web 和 PWA。对于原生应用,我使用 Flutter。
猜你喜欢
  • 2017-05-10
  • 2022-08-21
  • 1970-01-01
  • 2018-03-10
  • 2017-07-12
  • 2016-12-25
  • 2020-09-16
  • 2017-06-13
  • 2021-03-04
相关资源
最近更新 更多