diff --git a/frontend/middleware/checkAuth.global.ts b/frontend/middleware/checkAuth.global.ts new file mode 100644 index 0000000..d153891 --- /dev/null +++ b/frontend/middleware/checkAuth.global.ts @@ -0,0 +1,57 @@ +import { useAuth } from "~/composables/api/auth/useAuth"; +import useRefreshAuth from "~/composables/api/auth/useRefreshAuth"; +import useVerify from "~/composables/api/auth/useVerify"; + +export default defineNuxtRouteMiddleware(() => { + // state + + const { mutateAsync: refreshAuth } = useRefreshAuth(); + const { token, refreshToken, updateToken, updateRefreshToken, logout } = + useAuth(); + const { mutateAsync: verify } = useVerify(); + + // lifecycle + + onServerPrefetch(async () => { + if (!!token.value) { + // 1.1 - token is there + + try { + await verify({ + token: token.value, + }); + + // 2.1 - token is valid, finish + } catch (e) { + // 2.2 - token is there, but not valid, try to refresh token + + if (!!refreshToken.value) { + // 3.1 - refresh token is there, try to refresh + + try { + const refreshResponse = await refreshAuth({ + refresh: refreshToken.value, + }); + + // 4.1 - token is refreshed successfully, finish + + updateToken(refreshResponse.access); + updateRefreshToken(refreshResponse.refresh); + } catch (e) { + // 4.2 - cant refreshing token, logout + + logout(); + } + } else { + // 3.2 - refresh token is not exist, logout + + logout(); + } + } + } else { + // 1.2 - token is not exist, logout + + logout(); + } + }); +});