Next.js中使用HOC w/ useSessionContext的Supabase身份验证重定向 Flink

j13ufse2  于 2023-06-22  发布在  Flink
关注(0)|答案(1)|浏览(165)

我正在Web应用程序中使用Supabase进行身份验证。我注意到,当我已经登录并尝试导航到登录页面进行测试时,它会在重定向到正确的受保护路由之前简要显示登录页面。即使使用useSessionContext()设置了isLoading状态,也会发生这种情况。
我希望它在isLoading为true时显示CircularProgress,然后,一旦isLoading为false且session为true(表示我已经登录),它将直接重定向我而不显示登录页面。然而,在实践中,我在重定向发生之前会看到登录页面。
在开发模式下,在重定向之前,此登录页面可见几秒钟。在生产模式下(使用npm start),它更像是一个 Flink 。为什么会发生这种情况,我如何使它只显示循环进度,而加载,然后直接重定向,如果我已经登录?

HOC组件

import CircularProgress from '@mui/material/CircularProgress';
import { useSessionContext } from '@supabase/auth-helpers-react';
import { useRouter } from 'next/router';
import { FC, useEffect } from 'react';
import ErrorIcon from '@mui/icons-material/Error';
import { Typography } from '@mui/material';

export const withAuth = <T extends Record<string, unknown>>(Component: FC<T>, redirectLink = '/') => {
    const AuthenticatedComponent: FC<T> = (props) => {
        const router = useRouter();
        const { isLoading, session, error } = useSessionContext();

        useEffect(() => {
            const checkAuth = async () => {
                if (session) {
                    await router.replace(redirectLink);
                }
            };
            checkAuth();
        }, [session, router]);

        if (isLoading) return <CircularProgress color='primary' size={'2rem'} />;

        if (error)
            return (
                <>
                    <ErrorIcon color='error' fontSize='large' />
                    <Typography variant='body1'>We are experiencing technical difficulties. Please try again later.</Typography>
                </>
            );

        return <Component {...(props as T)} />;
    };

    return AuthenticatedComponent;
};

登录页面

const LoginPage = () => {
    const supabaseClient = useSupabaseClient();
    return (
        <Box sx={{ width: '50%', padding: '50px' }}>
            <Auth redirectTo='/' appearance={{ theme: ThemeSupa }} supabaseClient={supabaseClient} providers={['google']} socialLayout='horizontal' />
        </Box>
    );
};

export default withAuth(LoginPage);
nszi6y05

nszi6y051#

经过一些调查,我意识到在重定向之前短暂显示登录页面是由于会话检查和重定向操作都是异步的。因此,在重定向操作发生之前,登录页面呈现会有一个小的延迟。
最初,我显示CircularProgress的条件是只有当isLoading为true时,即会话检查正在进行时。然而,这似乎不足以阻止登录页面的短暂显示,因为重定向操作也需要时间来完成。
我已经找到了解决这个问题的方法,不仅在会话检查期间显示加载微调器,而且在会话存在和重定向即将发生时也显示加载微调器。
我这样更新了我的代码:

if (isLoading || session) {
    return <CircularProgress color='primary' size={'2rem'} />;
}

现在,加载微调器将在会话检查(isLoading为true)和重定向过程(session为true)期间显示。因此,加载微调器将停留在屏幕上,直到会话检查完成并完成重定向操作。这有效地防止了登录页面在重定向之前在屏幕上短暂 Flink 。

相关问题