From f9bd9292edd0d2d59806683ac64bbaef2a2549d4 Mon Sep 17 00:00:00 2001 From: Urban Modig Date: Mon, 13 Oct 2025 00:24:35 +0200 Subject: [PATCH] feat(auth): add callback, silent renew and logout routes --- auth/RequireAuth.tsx | 18 ++++++++++++++++++ src/pages/AuthCallbackPage.tsx | 15 +++++++++++++++ src/pages/LogoutPage.tsx | 7 +++++++ src/pages/SilentRenewPage.tsx | 8 ++++++++ 4 files changed, 48 insertions(+) create mode 100644 auth/RequireAuth.tsx create mode 100644 src/pages/AuthCallbackPage.tsx create mode 100644 src/pages/LogoutPage.tsx create mode 100644 src/pages/SilentRenewPage.tsx diff --git a/auth/RequireAuth.tsx b/auth/RequireAuth.tsx new file mode 100644 index 0000000..77eb6cb --- /dev/null +++ b/auth/RequireAuth.tsx @@ -0,0 +1,18 @@ +import { PropsWithChildren, useEffect } from 'react' +import { useLocation } from 'react-router-dom' +import { useAuth } from './AuthProvider' + + +export function RequireAuth({ children }: PropsWithChildren) { +const { isAuthenticated, signIn } = useAuth() +const loc = useLocation() + + +useEffect(() => { +if (!isAuthenticated) void signIn(loc.pathname + loc.search) +}, [isAuthenticated, signIn, loc]) + + +if (!isAuthenticated) return null +return <>{children} +} \ No newline at end of file diff --git a/src/pages/AuthCallbackPage.tsx b/src/pages/AuthCallbackPage.tsx new file mode 100644 index 0000000..22e7562 --- /dev/null +++ b/src/pages/AuthCallbackPage.tsx @@ -0,0 +1,15 @@ +import { useEffect } from 'react' +import { useNavigate } from 'react-router-dom' +import { userManager } from 'auth/oidc' + + +export default function AuthCallbackPage() { +const navigate = useNavigate() +useEffect(() => { +userManager.signinRedirectCallback().then((res) => { +const target = (res?.state as any)?.returnTo || '/' +navigate(target, { replace: true }) +}) +}, [navigate]) +return

Completing sign-in…

+} \ No newline at end of file diff --git a/src/pages/LogoutPage.tsx b/src/pages/LogoutPage.tsx new file mode 100644 index 0000000..d40a799 --- /dev/null +++ b/src/pages/LogoutPage.tsx @@ -0,0 +1,7 @@ +import { useEffect } from 'react' +import { useAuth } from 'auth/AuthProvider' +export default function LogoutPage() { + const { signOut } = useAuth() + useEffect(() => { void signOut() }, [signOut]) + return

Signing out…

+} \ No newline at end of file diff --git a/src/pages/SilentRenewPage.tsx b/src/pages/SilentRenewPage.tsx new file mode 100644 index 0000000..bdf85cc --- /dev/null +++ b/src/pages/SilentRenewPage.tsx @@ -0,0 +1,8 @@ +import { useEffect } from 'react' +import { userManager } from 'auth/oidc' + + +export default function SilentRenewPage() { +useEffect(() => { userManager.signinSilentCallback() }, []) +return

Silent renew…

+} \ No newline at end of file