Authentification fonctionnelle via security.lions.dev

This commit is contained in:
DahoudG
2025-11-01 14:16:20 +00:00
parent a5adb84a62
commit 1d68878601
20 changed files with 387 additions and 1067 deletions

78
lib/auth.ts Normal file
View File

@@ -0,0 +1,78 @@
/**
* Utilitaires d'authentification centralisés
* Utilise le SDK Keycloak JS pour toutes les opérations d'authentification
*
* IMPORTANT: Utilise un import conditionnel pour éviter les erreurs SSR
*/
/**
* Récupère l'instance Keycloak de manière sécurisée (client-side uniquement)
*/
const getKeycloak = async () => {
if (typeof window === 'undefined') return null;
const { default: keycloak } = await import('./keycloak');
return keycloak;
};
/**
* Redirige vers la page de connexion Keycloak
*/
export const redirectToLogin = async (returnUrl?: string) => {
if (typeof window === 'undefined') return;
const keycloak = await getKeycloak();
if (keycloak) {
const redirectUri = returnUrl
? `${window.location.origin}${returnUrl}`
: `${window.location.origin}/dashboard`;
keycloak.login({ redirectUri });
} else {
console.error('❌ Keycloak non initialisé');
}
};
/**
* Redirige vers la page de déconnexion Keycloak
*/
export const redirectToLogout = async () => {
if (typeof window === 'undefined') return;
const keycloak = await getKeycloak();
if (keycloak) {
keycloak.logout({ redirectUri: window.location.origin });
} else {
console.error('❌ Keycloak non initialisé');
}
};
/**
* Vérifie si l'utilisateur est authentifié
*/
export const isAuthenticated = async (): Promise<boolean> => {
const keycloak = await getKeycloak();
return keycloak?.authenticated ?? false;
};
/**
* Récupère le token d'accès actuel
*/
export const getAccessToken = async (): Promise<string | undefined> => {
const keycloak = await getKeycloak();
return keycloak?.token;
};
/**
* Rafraîchit le token si nécessaire
*/
export const refreshToken = async (minValidity: number = 30): Promise<boolean> => {
const keycloak = await getKeycloak();
if (!keycloak) return false;
try {
return await keycloak.updateToken(minValidity);
} catch (error) {
console.error('❌ Erreur lors du rafraîchissement du token:', error);
return false;
}
};

14
lib/keycloak.ts Normal file
View File

@@ -0,0 +1,14 @@
import Keycloak from 'keycloak-js';
// Configuration Keycloak
const keycloakConfig = {
url: process.env.NEXT_PUBLIC_KEYCLOAK_URL || 'https://security.lions.dev',
realm: process.env.NEXT_PUBLIC_KEYCLOAK_REALM || 'btpxpress',
clientId: process.env.NEXT_PUBLIC_KEYCLOAK_CLIENT_ID || 'btpxpress-frontend',
};
// Créer une instance Keycloak uniquement côté client
// Pour éviter les erreurs SSR (document is not defined)
const keycloak = typeof window !== 'undefined' ? new Keycloak(keycloakConfig) : null;
export default keycloak as Keycloak;