From 91ec895fd262e87b9d74a2e017ddf6bb684886cc Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Sun, 8 Sep 2024 20:56:33 +0800 Subject: [PATCH] fix: oauth (#2640) * fix: oauth * remove log * fix: oauth dispatch --- projects/app/src/pages/login/provider.tsx | 51 +++++++++++------------ projects/app/src/pages/login/sso.tsx | 17 +++++--- projects/app/src/web/support/user/auth.ts | 2 +- 3 files changed, 38 insertions(+), 32 deletions(-) diff --git a/projects/app/src/pages/login/provider.tsx b/projects/app/src/pages/login/provider.tsx index a43039fa4..a78a05462 100644 --- a/projects/app/src/pages/login/provider.tsx +++ b/projects/app/src/pages/login/provider.tsx @@ -12,6 +12,8 @@ import { serviceSideProps } from '@/web/common/utils/i18n'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useTranslation } from 'next-i18next'; +let isOauthLogging = false; + const provider = () => { const { t } = useTranslation(); const { loginStore } = useSystemStore(); @@ -20,7 +22,6 @@ const provider = () => { const router = useRouter(); const { code, state, error } = router.query as { code: string; state: string; error?: string }; const { toast } = useToast(); - const loading = useRef(false); const loginSuccess = useCallback( (res: ResLogin) => { @@ -31,21 +32,13 @@ const provider = () => { setLastChatId(''); setLastChatAppId(''); - setTimeout(() => { - router.push( - loginStore?.lastRoute ? decodeURIComponent(loginStore?.lastRoute) : '/app/list' - ); - }, 100); + router.push(loginStore?.lastRoute ? decodeURIComponent(loginStore?.lastRoute) : '/app/list'); }, [setLastChatId, setLastChatAppId, setUserInfo, router, loginStore?.lastRoute] ); const authCode = useCallback( async (code: string) => { - if (loading.current) return; - - loading.current = true; - if (!loginStore) { router.replace('/login'); return; @@ -91,24 +84,30 @@ const provider = () => { return; } - if (!code || !loginStore || !state) return; + if (!code || !loginStore?.state || !state) return; - clearToken(); - router.prefetch('/app/list'); + if (isOauthLogging) return; - if (state !== loginStore?.state) { - toast({ - status: 'warning', - title: t('common:support.user.login.security_failed') - }); - setTimeout(() => { - router.replace('/login'); - }, 1000); - return; - } else { - authCode(code); - } - }, [authCode, code, error, loginStore, router, state, t, toast]); + isOauthLogging = true; + + (async () => { + await clearToken(); + router.prefetch('/app/list'); + + if (state !== loginStore?.state) { + toast({ + status: 'warning', + title: t('common:support.user.login.security_failed') + }); + setTimeout(() => { + router.replace('/login'); + }, 1000); + return; + } else { + authCode(code); + } + })(); + }, [authCode, code, error, loginStore, loginStore?.state, router, state, t, toast]); return ; }; diff --git a/projects/app/src/pages/login/sso.tsx b/projects/app/src/pages/login/sso.tsx index 099fa672f..e53c36855 100644 --- a/projects/app/src/pages/login/sso.tsx +++ b/projects/app/src/pages/login/sso.tsx @@ -11,13 +11,14 @@ import { serviceSideProps } from '@/web/common/utils/i18n'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; +let isOauthLogging = false; + const provider = () => { const { t } = useTranslation(); const { setLastChatId, setLastChatAppId } = useChatStore(); const { setUserInfo } = useUserStore(); const router = useRouter(); const { query } = router; - const loading = useRef(false); const { toast } = useToast(); const loginSuccess = useCallback( @@ -34,8 +35,8 @@ const provider = () => { ); const handleSSO = useCallback(async () => { - if (loading.current) return; - loading.current = true; + if (isOauthLogging) return; + isOauthLogging = true; try { const res = await ssoLogin(query); @@ -64,8 +65,14 @@ const provider = () => { useEffect(() => { if (query && Object.keys(query).length > 0) { - clearToken(); - handleSSO(); + if (isOauthLogging) return; + + isOauthLogging = true; + + (async () => { + await clearToken(); + handleSSO(); + })(); } }, [handleSSO, query]); diff --git a/projects/app/src/web/support/user/auth.ts b/projects/app/src/web/support/user/auth.ts index d4d0c1d66..c667f9b71 100644 --- a/projects/app/src/web/support/user/auth.ts +++ b/projects/app/src/web/support/user/auth.ts @@ -3,8 +3,8 @@ import { loginOut } from '@/web/support/user/api'; const tokenKey = 'token'; export const clearToken = () => { try { - loginOut(); localStorage.removeItem(tokenKey); + return loginOut(); } catch (error) { error; }