diff options
| author | Adam Soltys <[email protected]> | 2026-01-21 15:00:02 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-01-21 15:00:02 -0800 |
| commit | 5248bf5ffca4c8b3303de4c73d11c9f7f0cfde13 (patch) | |
| tree | 33ad949937238d4b8d286829bf6418aed235fcf5 | |
| parent | 76bbaa296e2fa5a0bf51e15dd8b51011b0ee4a1e (diff) | |
| download | coinos-ui-5248bf5ffca4c8b3303de4c73d11c9f7f0cfde13.tar.gz coinos-ui-5248bf5ffca4c8b3303de4c73d11c9f7f0cfde13.zip | |
redirect on invalid token
| -rw-r--r-- | src/lib/utils.ts | 14 | ||||
| -rw-r--r-- | src/routes/(app)/+layout.server.ts | 19 | ||||
| -rw-r--r-- | src/routes/(app)/admin/+layout.server.ts | 10 | ||||
| -rw-r--r-- | src/routes/(static)/+layout.server.ts | 9 | ||||
| -rw-r--r-- | src/routes/+layout.server.ts | 21 |
5 files changed, 63 insertions, 10 deletions
diff --git a/src/lib/utils.ts b/src/lib/utils.ts index a3d9cd49..f220ed45 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -199,6 +199,20 @@ export const auth = (cookies) => ({ authorization: `Bearer ${cookies.get("token")}`, }); +export const isInvalidTokenError = (e: unknown) => { + const message = (e as Error)?.message || ""; + if (!message) return false; + const normalized = message.toLowerCase(); + return ( + normalized.includes("jwt") || + normalized.includes("invalid token") || + normalized.includes("token expired") || + normalized.includes("expired token") || + normalized.includes("unauthorized") || + normalized.includes("not authorized") + ); +}; + export const btc = (fiat: number, rate: number): number => Math.round((fiat * sats) / rate); diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/(app)/+layout.server.ts index e28d8b56..8b694241 100644 --- a/src/routes/(app)/+layout.server.ts +++ b/src/routes/(app)/+layout.server.ts @@ -1,4 +1,4 @@ -import { auth, get, sleep } from "$lib/utils"; +import { auth, get, isInvalidTokenError, sleep } from "$lib/utils"; import { error, redirect } from "@sveltejs/kit"; export async function load({ cookies, request, url, params }) { @@ -12,8 +12,21 @@ export async function load({ cookies, request, url, params }) { user = await get("/me", auth(cookies)); } catch (e) { const { message } = e as Error; - if (message.startsWith("Rate")) await sleep(3000); - user = await get("/me", auth(cookies)); + if (message.startsWith("Rate")) { + await sleep(3000); + try { + user = await get("/me", auth(cookies)); + } catch (retryError) { + if (isInvalidTokenError(retryError) && pathname !== "/logout") { + redirect(307, "/logout"); + } + throw retryError; + } + } else if (isInvalidTokenError(e) && pathname !== "/logout") { + redirect(307, "/logout"); + } else { + throw e; + } } } diff --git a/src/routes/(app)/admin/+layout.server.ts b/src/routes/(app)/admin/+layout.server.ts index d4aa181d..a2da1a90 100644 --- a/src/routes/(app)/admin/+layout.server.ts +++ b/src/routes/(app)/admin/+layout.server.ts @@ -1,10 +1,16 @@ -import { auth, get } from "$lib/utils"; +import { auth, get, isInvalidTokenError } from "$lib/utils"; import { redirect } from "@sveltejs/kit"; export async function load({ cookies }) { const token = cookies.get("token"); if (!token) redirect(307, "/login"); - const user = await get("/me", auth(cookies)); + let user; + try { + user = await get("/me", auth(cookies)); + } catch (e) { + if (isInvalidTokenError(e)) redirect(307, "/logout"); + throw e; + } if (!user) redirect(307, "/login"); return { user }; diff --git a/src/routes/(static)/+layout.server.ts b/src/routes/(static)/+layout.server.ts index c780b5e0..5de752fa 100644 --- a/src/routes/(static)/+layout.server.ts +++ b/src/routes/(static)/+layout.server.ts @@ -1,4 +1,5 @@ -import { get, auth } from "$lib/utils"; +import { auth, get, isInvalidTokenError } from "$lib/utils"; +import { redirect } from "@sveltejs/kit"; export async function load({ cookies }) { const token = cookies.get("token"); @@ -7,7 +8,11 @@ export async function load({ cookies }) { if (token) { try { user = await get("/me", auth(cookies)); - } catch (e) {} + } catch (e) { + if (isInvalidTokenError(e)) { + redirect(307, "/logout"); + } + } } return { user }; diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index 584e836c..c1f77695 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -3,7 +3,8 @@ import { loadTranslations, locales, } from "$lib/translations/index"; -import { auth, get, sleep } from "$lib/utils"; +import { auth, get, isInvalidTokenError, sleep } from "$lib/utils"; +import { redirect } from "@sveltejs/kit"; export const load = async ({ cookies, request, url }) => { const { host, pathname } = url; @@ -13,8 +14,22 @@ export const load = async ({ cookies, request, url }) => { try { user = await get("/me", auth(cookies)); } catch (e) { - if (e.message.startsWith("Rate")) await sleep(3000); - user = await get("/me", auth(cookies)); + const { message } = e as Error; + if (message.startsWith("Rate")) { + await sleep(3000); + try { + user = await get("/me", auth(cookies)); + } catch (retryError) { + if (isInvalidTokenError(retryError) && pathname !== "/logout") { + redirect(307, "/logout"); + } + throw retryError; + } + } else if (isInvalidTokenError(e) && pathname !== "/logout") { + redirect(307, "/logout"); + } else { + throw e; + } } } |
