From 7df5994251c30c1e9e7c0e7f73a177fc8409ee65 Mon Sep 17 00:00:00 2001 From: toir-bot Date: Mon, 13 Apr 2026 15:16:37 +0000 Subject: [PATCH] chore: initial project scaffold: frontend/src/authProvider.ts --- frontend/src/authProvider.ts | 60 ++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 frontend/src/authProvider.ts diff --git a/frontend/src/authProvider.ts b/frontend/src/authProvider.ts new file mode 100644 index 0000000..917d221 --- /dev/null +++ b/frontend/src/authProvider.ts @@ -0,0 +1,60 @@ +import Keycloak from 'keycloak-js'; +import { AuthProvider } from 'react-admin'; + +const keycloak = new Keycloak({ + url: import.meta.env.VITE_KEYCLOAK_URL, + realm: import.meta.env.VITE_KEYCLOAK_REALM, + clientId: import.meta.env.VITE_KEYCLOAK_CLIENT_ID, +}); + +let authenticated = false; + +export const initKeycloak = async (): Promise => { + authenticated = await keycloak.init({ + onLoad: 'login-required', + checkLoginIframe: false, + }); + return authenticated; +}; + +export const getToken = (): string | undefined => keycloak.token; + +export const authProvider: AuthProvider = { + login: async () => { + if (!authenticated) { + await keycloak.login(); + } + }, + logout: async () => { + await keycloak.logout({ redirectUri: window.location.origin }); + }, + checkError: async (error) => { + if (error.status === 401 || error.status === 403) { + try { + const refreshed = await keycloak.updateToken(30); + if (!refreshed) throw new Error('Token refresh failed'); + } catch { + await keycloak.logout({ redirectUri: window.location.origin }); + throw new Error('Session expired'); + } + } + }, + checkAuth: async () => { + if (!keycloak.authenticated) { + throw new Error('Not authenticated'); + } + try { + await keycloak.updateToken(30); + } catch { + throw new Error('Token refresh failed'); + } + }, + getPermissions: async () => { + const roles = keycloak.tokenParsed?.realm_access?.roles ?? []; + return roles; + }, + getIdentity: async () => ({ + id: keycloak.tokenParsed?.sub ?? '', + fullName: keycloak.tokenParsed?.preferred_username ?? '', + }), +};