Skip to content

Commit f54a642

Browse files
committed
frontend/utils: add authentication middleware to handle token refresh
1 parent 6868bd2 commit f54a642

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

frontend/src/utils.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { signal } from "@preact/signals";
22
import { hash, ArgonType } from "argon2-browser";
3-
import createClient from "openapi-fetch";
3+
import createClient, { Middleware } from "openapi-fetch";
44
import type { paths } from "./schema";
55
import { logout } from "./components/Navbar";
66

@@ -66,7 +66,24 @@ export const PASSWORD_PATTERN = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}/;
6666
export const BACKEND = import.meta.env.VITE_BACKEND_URL;
6767
export const FRONTEND_URL = import.meta.env.VITE_FRONTEND_URL;
6868

69+
let auth_already_failed = false;
6970
export const fetchClient = createClient<paths>({baseUrl: BACKEND});
71+
const AuthMiddleware: Middleware = {
72+
async onResponse({request, response, options}) {
73+
// Ingnore jwt refresh route since it will cause a deadlock when failing
74+
if (request.url.indexOf("/jwt_refresh") !== -1) {
75+
return undefined;
76+
}
77+
78+
if (response.status === 401 && !auth_already_failed) {
79+
await refresh_access_token();
80+
return await fetch(request);
81+
} else {
82+
return response;
83+
}
84+
}
85+
}
86+
fetchClient.use(AuthMiddleware);
7087

7188
export let enableLogging = false;
7289

@@ -108,6 +125,7 @@ export function refresh_access_token() {
108125
}
109126
loggedIn.value = AppState.LoggedIn;
110127
} else {
128+
auth_already_failed = true;
111129
localStorage.removeItem("loginSalt");
112130
localStorage.removeItem("secretKey");
113131
loggedIn.value = AppState.LoggedOut;

0 commit comments

Comments
 (0)