代码之家  ›  专栏  ›  技术社区  ›  Jessica

currentUser正在返回null

  •  0
  • Jessica  · 技术社区  · 2 年前

    我有一个使用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() 但是 当前用户 正在返回null。

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

    这是消防基地。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 };
    

    我怎么打电话 当前用户 用户登录后从另一个文件中删除?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Frank van Puffelen    2 年前

    这是预期的行为。由于books页面是一个新页面,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
        // ...
      }
    });
    

    当用户会话被恢复时,或当恢复失败时,或当从未有登录用户开始时,或当身份验证状态更改时,此回调将自动触发,因此是将应用程序更新为最新身份验证状态的最佳位置。