如何在 React 应用程序中处理 Firebase onAuthStateChanged 并相应地路由用户?

2024-02-05

我正在开发一个与 Firebase 集成的 React Web 应用程序,并且我正在尝试对我的用户进行身份验证。我已经设置了路线,以便在用户通过身份验证时显示主页组件,否则显示登录页面。但是,当我的应用程序首次加载时,它会显示登录页面,需要一两秒的时间才能识别用户实际上已通过身份验证,然后切换到主页。它看起来很混乱,我猜我没有很好地或足够快地处理 onAuthStateChanged 。在我的 App 组件中,我订阅了一个 ReactObserver,它会在身份验证状态发生更改时发出信号。我该怎么做才能避免这种奇怪的行为?

My App.js:

import {BrowserRouter, Route} from "react-router-dom";
import Home from "./Home";
import Login from "./Login";
import {loggedIn, firebaseObserver} from "../firebase";
import {useEffect, useState} from "react";

export default function App() {
    const [authenticated, setAuthenticated] = useState(loggedIn())

    useEffect(() => {
        firebaseObserver.subscribe('authStateChanged', data => {
            setAuthenticated(data);
        });
        return () => { firebaseObserver.unsubscribe('authStateChanged'); }
    }, []);

   return <BrowserRouter>
             <Route exact path="/" render={() => (authenticated ? <Home/> : <Login/>)} />
          </BrowserRouter>;
}

My firebase.js:

import firebase from "firebase/app";
import "firebase/auth";
import "firebase/firestore";
import ReactObserver from 'react-event-observer';

const firebaseConfig = {
    apiKey: ...,
    authDomain: ...,
    projectId: ...,
    storageBucket: ...,
    messagingSenderId: ...,
    appId: ...
};
firebase.initializeApp(firebaseConfig);
export const auth = firebase.auth();
export const firestore = firebase.firestore();
export const firebaseObserver = ReactObserver();

auth.onAuthStateChanged(function(user) {
    firebaseObserver.publish("authStateChanged", loggedIn())
});

export function loggedIn() {
    return !!auth.currentUser;
}

对于可能关心的人来说,在身份验证实际加载时添加一个简单的标志解决了我的问题。我还添加了受保护的路线(灵感来自本文 https://dev.to/pprathameshmore/protected-routes-in-react-js-216i我想我现在可以很好地继续我的项目了。

App.js:

import {BrowserRouter, Redirect, Route, Switch} from "react-router-dom";
import Home from "./Home";
import Login from "./Login";
import {PrivateRoute} from "./PrivateRoute";
import {loggedIn, firebaseObserver} from "../firebase";
import {useEffect, useState} from "react";

export default function App() {
    const [authenticated, setAuthenticated] = useState(loggedIn());
    const [isLoading, setIsLoading] = useState(true);

    useEffect(() => {
        firebaseObserver.subscribe('authStateChanged', data => {
            setAuthenticated(data);
            setIsLoading(false);
        });
        return () => { firebaseObserver.unsubscribe('authStateChanged'); }
    }, []);

    return isLoading ? <div/> :
        <BrowserRouter>
            <Switch>
                <Route path="/" exact>
                    <Redirect to={authenticated ? "/home" : "/login"} />
                </Route>
                <PrivateRoute path="/home" exact
                              component={Home}
                              hasAccess={authenticated} />
                <PrivateRoute path="/login" exact
                              component={Login}
                              hasAccess={!authenticated} />
                <Route path="*">
                    <Redirect to={authenticated ? "/home" : "/login"} />
                </Route>
            </Switch>
        </BrowserRouter>;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 React 应用程序中处理 Firebase onAuthStateChanged 并相应地路由用户? 的相关文章

随机推荐

  • Python pandas 相当于替换

    在R中 有一个相当有用的replace功能 本质上 它在数据帧的给定列中进行有条件的重新分配 它可以这样使用 replace df column df column 1 Type 1 在 pandas 中实现相同目标的好方法是什么 我应该使
  • 仅通过命令行在 Windows 上运行 CMake 生成的 INSTALL.vcxproj?

    我有一个 C 程序 正在尝试在 AppVeyor 上构建和部署 因此 我没有可用的 GUI 工具 我的项目的依赖项均使用 CMake 作为其构建系统 并且 CMake 默认情况下 在 Windows 上生成 Visual Studio 项目
  • Java - 同时将两个表达式分配给一个变量

    我刚刚学完 Java 第一年 我一直在查看 JDK 源代码作为练习 我遇到了以前从未遇到过的情况 即在同一个语句中对同一个变量进行了两次赋值 e g variable 表达 表达 这里究竟发生了什么 这是一个相当普遍的事情吗 双重作业的目的
  • 有效连接多个 sas 数据集

    我有超过 200k 个具有相同变量 n macro catDat name nbr call in new dataset data new set libin name run reorder names proc sql noprint
  • ie11 的 CSS 自定义属性 polyfill

    有没有办法用 JavaScript 来 pollyfill ie11 的自定义 CSS 属性 我在考虑加载 检查浏览器是否支持自定义属性 如果不支持 则对属性进行某种查找和替换 这可以通过 JavaScript 或某些库实现吗 Thanks
  • 客户端 javascript 相当于 Lucene

    我想知道是否有一个相当于 Lucene API 的 Javascript 旨在用于客户端来索引相对较小的数据集 一个示例用例是静态站点 例如生成的 能够搜索内容而无需服务器端处理 我发现了这个 http lunrjs com http lu
  • Asp.net 验证错误消息更改标签文本

    我正在使用 asp net 验证控件来验证用户输入 我想要的是使用验证控件生成的错误消息更改标签文本
  • 角度 (1.5.8) 动态组件

    我正在尝试使用 Angular 1 5 8 构建一种动态仪表板 直到最后一个障碍 我已经取得了不错的进步 这实际上是在渲染动态组件 我尝试了 2 个选项 要么添加一个ui view并以编程方式传递小部件的名称 or 这就是我猜的路线more
  • 将参数从父函数传递给嵌套函数Python

    这是我的代码 def f x def g n if n lt 10 x x 1 g n 1 g 0 当我评估 f 0 时 会出现错误 赋值前引用了 x 但是 当我使用 print x 而不是 x x 1 时 它会起作用 看来在 g 的范围内
  • C# 定时器或 Thread.Sleep

    我正在运行 Windows 服务并使用循环和 Thread Sleep 来重复任务 使用计时器方法会更好吗 如果是的话 代码示例会很棒 我目前正在使用此代码来重复 int curMinute int lastMinute DateTime
  • 枚举的通用类,值的数量

    我如何知道我的枚举在此示例中有多少个值 public class Analyser
  • 如何使用服务的输入/输出动态创建组件实例并将其单独注入到 DOM 中?

    在 Angular 2 中创建动态组件时 我found https stackoverflow com questions 36325212 angular 2 dynamic tabs with user click chosen com
  • 将表单和框架添加到包中

    我正在开发一个 IDE 注册组件包 其中大部分都派生自 TFrame 基类 包中还包含这些组件调用的各种自定义对话框表单 我在 Delphi 2007 工作 我注意到 有时框架和表单单元 通常具有关联的 DFM 文件 并不总是在其下方 下方
  • WSO2 EMM:从设备管理中删除设备

    我成功将 Android 设备注册到 EMM 然后我恢复出厂设置并重新注册 现在 同一设备在我的设备管理中列出了两次 第一件事 这种行为是想要的吗 我认为应该有一个规则来检查 IMEI 并用新注册的对象替换旧对象 第二件事 如何摆脱旧对象
  • tidyverse 中多个群体的引导:rsample 与 broom

    In 这个问题 https stackoverflow com questions 42986736 bootstrapping by multiple groups in dplyr由几个小组和子小组进行引导似乎很容易使用broom bo
  • urllib 异常 http.client.BadStatusLine

    我一生都无法弄清楚为什么我不能捕获这个异常 看着这里本指南 https docs python org 3 howto urllib2 html def get team names get team id url team id prin
  • 错误 404 的默认重定向

    我想在我的 ASP net 网站中引入一项功能 每当收到对我的域中未知 URL 的请求时 用户就会被重定向到我的网站error 404 htm应用程序根目录中的页面 例如 如果请求是http www mydomain com blahbla
  • System.IO.ReadAllxxx / WriteAllxxx 方法的性能

    是否有 System IO File ReadAllxxx WriteAllxxx 方法与 Web 上提供的 StreamReader StremWriter 类的性能比较 您认为在 net 3 0 中读取 写入文本文件的最佳方式 从性能角
  • Cloud Functions 中的 Cloud Firestore

    我想将新的 Cloud Firestore 集成到我的 Cloud Functions 中 我更新了 node js 并在我的 Mac 上安装了最新的 firebase 版本 文档说 exports myFunctionName funct
  • 如何在 React 应用程序中处理 Firebase onAuthStateChanged 并相应地路由用户?

    我正在开发一个与 Firebase 集成的 React Web 应用程序 并且我正在尝试对我的用户进行身份验证 我已经设置了路线 以便在用户通过身份验证时显示主页组件 否则显示登录页面 但是 当我的应用程序首次加载时 它会显示登录页面 需要