fix(frontend): redirect to /login when the session can't be refreshed
On a failed token refresh the client cleared the auth store and threw, but nothing navigated away, so an expired session left the user on a page that only showed errors. Redirect to /login when the refresh token is missing or rejected. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,18 @@
|
|||||||
import { get } from 'svelte/store';
|
import { get } from 'svelte/store';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { browser } from '$app/environment';
|
||||||
import { authStore } from '$lib/stores/auth';
|
import { authStore } from '$lib/stores/auth';
|
||||||
|
|
||||||
const BASE = '/api/v1';
|
const BASE = '/api/v1';
|
||||||
|
|
||||||
|
/** Clear the session and bounce to the login screen. Called when the refresh
|
||||||
|
* token is missing or rejected, so an expired session doesn't strand the user
|
||||||
|
* on a page that only shows errors. */
|
||||||
|
function endSession(): void {
|
||||||
|
authStore.set({ accessToken: null, refreshToken: null, user: null });
|
||||||
|
if (browser) void goto('/login');
|
||||||
|
}
|
||||||
|
|
||||||
export class ApiError extends Error {
|
export class ApiError extends Error {
|
||||||
constructor(
|
constructor(
|
||||||
public readonly status: number,
|
public readonly status: number,
|
||||||
@@ -21,7 +31,7 @@ let refreshPromise: Promise<void> | null = null;
|
|||||||
async function refreshTokens(): Promise<void> {
|
async function refreshTokens(): Promise<void> {
|
||||||
const { refreshToken } = get(authStore);
|
const { refreshToken } = get(authStore);
|
||||||
if (!refreshToken) {
|
if (!refreshToken) {
|
||||||
authStore.set({ accessToken: null, refreshToken: null, user: null });
|
endSession();
|
||||||
throw new ApiError(401, 'unauthorized', 'Session expired');
|
throw new ApiError(401, 'unauthorized', 'Session expired');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +42,7 @@ async function refreshTokens(): Promise<void> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
authStore.set({ accessToken: null, refreshToken: null, user: null });
|
endSession();
|
||||||
throw new ApiError(401, 'unauthorized', 'Session expired');
|
throw new ApiError(401, 'unauthorized', 'Session expired');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user