Redux firebase - 正确处理身份验证状态(前几毫秒状态为空,直到加载)

Posted

技术标签:

【中文标题】Redux firebase - 正确处理身份验证状态(前几毫秒状态为空,直到加载)【英文标题】:Redux firebase - Handle authenticated state properly (first few miliseconds state is null until loaded) 【发布时间】:2022-01-15 07:22:17 【问题描述】:

我在我的 React 应用程序中使用带有 redux 的 firebase,在这里遇到了一些问题。第一个是:

    首次应用启动后,使用电子邮件/密码登录或通过社交(google、fb、apple)登录不会检测到已验证状态(标题内容取决于已验证/未验证状态),直到页面刷新。每次下一次登录时,登录/注销后标题内容都会发生变化,并且会检测到状态变化。解决方法是在await firebase.auth().signInWithEmailAndPassword(email, password); 之后添加window.location.reload(),但我不希望这种额外的重新加载。

    当身份验证状态为 null 时,初始的几毫秒时间,即使用户在应用启动或应用刷新时登录 firebase,直到填充,并且由于此初始 null 值,它会导致某些组件的渲染不正确。

这是我的身份验证钩子:

export function useAuthentication() 
   const firebase = getFirebase();
   // this token is just additional token from my backend (not related to firebase)
   const token = localStorage.getItem('token') || null;
   const [loggedIn, setLoggedIn] = useState(true);

   useEffect(() => 
      firebase.auth().onAuthStateChanged(async (user) => 
         if (!user && !token) 
            setLoggedIn(false);
          else 
            setLoggedIn(true);
         
      );
   , [firebase, token]);

   return  loggedIn ;

如何改进/添加对已验证状态的更好处理?

【问题讨论】:

【参考方案1】:

因为身份验证是客户端,您只需要处理最初不知道身份验证状态的问题(或将您的身份验证移至服务器)。您可以将初始 isLoggedIn 状态设置为 null 并在代码中处理该状态,直到 isLoggedIn 设置为 true/false。

export function useAuthentication() 
   const firebase = getFirebase();
   // this token is just additional token from my backend (not related to firebase)
   const token = localStorage.getItem('token') || null;
   const [loggedIn, setLoggedIn] = useState(null);

   useEffect(() => 
      firebase.auth().onAuthStateChanged(async (user) => 
         if (!user && !token) 
            setLoggedIn(false);
          else 
            setLoggedIn(true);
         
      );
   , [firebase, token]);

   return  loggedIn ;

现在在你的代码中,你可以使用这个:

export function MyPageComponent() 
  const  isLoggedIn  = useAuthentication()

  if (isLoggedIn === null) 
    // Show a loading screen here because you don't have the
    // authentication state so you don't know if the user is
    // logged in or not
    return (<p>Loading</p>)
  
  // Now `isLoggedIn` will be true/false and you can handle the
  // state properly
  return (
    <MyPageWrapper isLoggedIn=isLoggedIn>
      ...
    </MyPageWrapper>
  )

【讨论】:

以上是关于Redux firebase - 正确处理身份验证状态(前几毫秒状态为空,直到加载)的主要内容,如果未能解决你的问题,请参考以下文章

使用 React Redux Redux-Thunk 进行 Firebase 身份验证

使用 React Native / Redux 和 Firebase 保持身份验证

使用带有 Redux 和 Firebase 身份验证的 React-Navigation v5

连接firebase和redux-sagas的正确方法是什么?

如何在通过 Redux 操作进行身份验证后重定向用户?

为啥我无法通过 Firebase 的身份验证?