reactjs - firebase 身份验证在刷新时延迟

标签 reactjs firebase react-router firebase-authentication

我的 SPA React/Firebase 应用程序上的硬刷新不会在立即执行函数时维护身份验证状态。我有一个解决方法,但它很粗略。

我的 react 路由利用onEnter函数来确定用户是否通过身份验证。例如

<Route path="/secure" component={Dashboard} onEnter={requireAuth}/>

此外,我的 requireAuth 函数如下所示:

function (nextState, replace) {
        console.log('requireAuth', firebase.auth().currentUser);
        if (!firebase.auth().currentUser) {
            console.log('attempting to access a secure route. please login first.');
            replace({
                pathname: '/login',
                state: { nextPathname: nextState.location.pathname }
            });
        }
};

但是,在硬刷新时,firebase.auth().currentUser 会出现轻微延迟。它首先为 null,然后向 firebase 服务器执行 POST 以确定身份验证状态。当它返回时,currentUser 对象被填充。但这种延迟会导致问题。

我的黑客解决方案如下:更新:这实际上不起作用......

function (nextState, replace) {
    setTimeout(function () {
        console.log('requireAuth', firebase.auth().currentUser);
        if (!firebase.auth().currentUser) {
            console.log('attempting to access a secure route. please login first.');
            replace({
                pathname: '/login',
                state: { nextPathname: nextState.location.pathname }
            });
        }
    }, 50);
};

只需将其包裹在超时中即可。但是,我真的不喜欢这个......有什么想法吗?

更新:

我还尝试将其包装在 onAuthStateChanged 监听器中,该监听器应该比具有明确时间延迟的 setTimeout 更准确。代码如下:

function (nextState, replace) {
    var unsubscribe = firebase.auth().onAuthStateChanged(function (user) {
        if (!user) {
            console.log('attempting to access a secure route');
            replace({
                pathname: '/login',
                state: { nextPathname: nextState.location.pathname }
            })
            console.log('should have called replace');
        }
        unsubscribe();
    });
    // setTimeout(function () {
    //     console.log('requireAuth', firebase.auth().currentUser);
    //     if (!firebase.auth().currentUser) {
    //         console.log('attempting to access a secure route. please login first.');
    //         replace({
    //             pathname: '/login',
    //             state: { nextPathname: nextState.location.pathname }
    //         });
    //     }
    // }, 50);
};

两条日志语句都执行了,但是react-router replace似乎没有正确执行。对于 react 路由器专家来说,也许这是一个不同的问题。

更新2:

我做这件事的时候已经是深夜了。显然 setTimeout 实际上也不起作用。

最佳答案

好的。因此,我能够通过利用 firebase 提供的 localStorage 变量来存储用户信息来解决这个问题。

function (nextState, replace) {
    if (!firebase.auth().currentUser) {
        let hasLocalStorageUser = false;
        for (let key in localStorage) {
            if (key.startsWith("firebase:authUser:")) {
                hasLocalStorageUser = true;
            }
        }
        if (!hasLocalStorageUser) {
            console.log('Attempting to access a secure route. Please authenticate first.');
            replace({
                pathname: '/login',
                state: { nextPathname: nextState.location.pathname }
            });
        }
    }
};

关于reactjs - firebase 身份验证在刷新时延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37370599/

相关文章:

objective-c - 如何在不在自定义创建的框架 Xcode 中添加 GoogleService-Info.plist 文件的情况下使用 Firebase 推送通知服务

javascript - 从 App.js 导航到 Places.js

javascript - 如何在React中使用dangerouslySetInnerHTML传递样式

reactjs - 如何使用 Jest 使用新的 React Router Hooks 模拟历史记录。

javascript - 如何将 "raw"DOM 事件转换为 React SyntheticEvent?

java - 将文档映射到以 'is' 开头的 Java 对象

javascript - 在 setState() 中重新设置整个状态

ios - 从 Firebase 获取数据的最有效方式

javascript - 警告 : Failed prop type: Invalid prop `component` of type `object` supplied to `Route` , 预期 `function` 使用 react-router-dom 时出错

javascript - 使用 React Router 从 Expressr 下载文件