currentUser 返回 null

currentUser is returning null

我有一个使用 firebase auth 进行身份验证的 React 应用程序。

一个人登录后,它将他们重定向到一个图书页面。这是 submitLogin 处理程序

import { auth, firebase } from "./firebase";
async function googleLogin() {
    const provider = new firebase.auth.GoogleAuthProvider();
    await auth.signInWithPopup(provider).then(
      async (result) => {
        const token = await auth?.currentUser?.getIdToken(true);
        if (token) {
          localStorage.setItem("@token", token);
          navigate("/book-list");
        }
      },
      function (error) {
        console.log(error);
      }
    );
}

然后在书籍页面中,我尝试获取 currentUser 以便我可以调用 getIdToken(),但是 currentUser 返回 null。

import { auth } from "./firebase";
const currentUser = auth.currentUser

这是 firebase.js 文件:

import firebase from 'firebase/compat/app';
import 'firebase/compat/auth';
import 'firebase/compat/firestore';

const firebaseConfig = {...};

firebase.initializeApp(firebaseConfig);

const auth = firebase.auth();
export { auth, firebase };

如何在用户登录后从另一个文件调用 currentUser

这是预期的行为。由于图书页面是一个新页面,Firebase SDK 需要从本地存储中恢复身份验证状态,并自动保存在本地存储中。这需要它调用服务器,例如检查帐户是否已被禁用。由于我们无法阻止页面加载,您的主要代码继续执行并看到 currentUser 为空。

您要做的是监听用户的身份验证状态,如 getting the current user 文档中的第一个片段所示:

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    // User is signed in, see docs for a list of available properties
    // https://firebase.google.com/docs/reference/js/firebase.User
    var uid = user.uid;
    // ...
  } else {
    // User is signed out
    // ...
  }
});

此回调将在用户会话恢复时自动触发,或者当会话失败时,或者当从来没有登录用户开始时,或者每当身份验证状态发生变化时,因此是完美的地方更新您的应用程序以获得最新的身份验证状态。