From ef388adc4fec84f7cf0a8d775e5728dd352eee44 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Tue, 17 Feb 2026 18:27:41 +0000 Subject: [PATCH] fix(server): avoid back to login after auth Replace /login history entry on success and redirect authenticated /login to /, with no-store headers to prevent caching. --- .../src/server/routes/auth-pages/login.html | 3 ++- packages/server/src/server/routes/auth.ts | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/server/src/server/routes/auth-pages/login.html b/packages/server/src/server/routes/auth-pages/login.html index c3f95ac8..5dea9c70 100644 --- a/packages/server/src/server/routes/auth-pages/login.html +++ b/packages/server/src/server/routes/auth-pages/login.html @@ -119,7 +119,8 @@ showError(message || `Login failed (${res.status})`) return } - window.location.href = "/" + // Replace history entry so Back doesn't return to /login. + window.location.replace("/") } catch (e) { showError(e && e.message ? e.message : String(e)) } diff --git a/packages/server/src/server/routes/auth.ts b/packages/server/src/server/routes/auth.ts index e47da74a..6bb7d3d3 100644 --- a/packages/server/src/server/routes/auth.ts +++ b/packages/server/src/server/routes/auth.ts @@ -51,7 +51,19 @@ function getTokenHtml(): string { } export function registerAuthRoutes(app: FastifyInstance, deps: RouteDeps) { - app.get("/login", async (_request, reply) => { + app.get("/login", async (request, reply) => { + // If already authenticated, don't show the login page. + const session = deps.authManager.getSessionFromRequest(request) + if (session) { + reply.redirect("/") + return + } + + // Avoid caching the login page (helps with bfcache/back behavior). + reply.header("Cache-Control", "no-store") + reply.header("Pragma", "no-cache") + reply.header("Expires", "0") + const status = deps.authManager.getStatus() reply.type("text/html").send(getLoginHtml(status.username)) }) @@ -67,6 +79,11 @@ export function registerAuthRoutes(app: FastifyInstance, deps: RouteDeps) { return } + // Avoid caching the token bootstrap page. + reply.header("Cache-Control", "no-store") + reply.header("Pragma", "no-cache") + reply.header("Expires", "0") + reply.type("text/html").send(getTokenHtml()) })