You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase认证用户刷新后会话丢失,私有路由跳转登录问题求助

解决Firebase Auth私有路由刷新后会话丢失问题

问题核心是页面刷新时,Firebase Auth需要异步恢复用户会话,此时projectAuth.currentUser初始为null,直接用它判断会误判为未登录,导致跳转到登录页。以下是具体解决方案:

步骤1:创建Auth状态监听Hook

通过Firebase的onAuthStateChanged监听用户状态变化,等待会话恢复完成:

// hooks/useAuth.js
import { useState, useEffect } from 'react';
import { projectAuth } from '../firebase';

export const useAuth = () => {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    // 订阅Auth状态变化,页面刷新时Firebase会自动恢复会话
    const unsubscribe = projectAuth.onAuthStateChanged((authUser) => {
      setUser(authUser);
      setLoading(false);
    });

    // 组件卸载时取消订阅
    return unsubscribe;
  }, []);

  return { user, loading };
};

步骤2:修改私有路由组件

使用上面的Hook替代直接访问currentUser,并添加加载状态避免误跳转:

import { Outlet, Navigate, useLocation } from "react-router-dom";
import { useAuth } from "./hooks/useAuth";

const PrivateRoute = () => {
  const location = useLocation();
  const { user, loading } = useAuth();

  // 等待Auth会话初始化完成,显示加载状态
  if (loading) {
    return <div>加载中...</div>; // 可替换为自定义加载UI
  }

  return user ? <Outlet /> : <Navigate to="/login" state={{ from: location }} replace />;
};

export default PrivateRoute;

原理说明

Firebase Auth默认会在浏览器中持久化用户会话(存储方式由Firebase自动管理),无需手动存储。onAuthStateChanged会在页面加载时触发异步检查,当Firebase完成会话恢复后,会返回当前用户对象,此时再判断是否允许访问私有路由,就不会出现刷新后跳转登录的问题。

内容的提问来源于stack exchange,提问作者Deezy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:12:57