import NextAuth, { NextAuthOptions } from "next-auth"; import KeycloakProvider from "next-auth/providers/keycloak"; export const authOptions: NextAuthOptions = { providers: [ KeycloakProvider({ clientId: process.env.KEYCLOAK_CLIENT_ID!, clientSecret: process.env.KEYCLOAK_CLIENT_SECRET!, issuer: process.env.KEYCLOAK_ISSUER!, // Personnalisation de la fonction profile pour inclure le rôle de Keycloak profile(profileData) { return { id: profileData.sub, name: profileData.name || profileData.preferred_username, email: profileData.email, image: null, // Extraction du rôle ou groupe de l'utilisateur depuis Keycloak role: Array.isArray(profileData.realm_access?.roles) ? profileData.realm_access.roles : [], }; }, }), ], callbacks: { async jwt({ token, account, profile }) { // Au moment de la première connexion, sauvegarde de l'access token et du rôle dans le JWT if (account && profile) { token.accessToken = account.access_token; token.role = profile.role; } return token; }, async session({ session, token }) { // On injecte l'access token et le rôle dans la session accessible côté client session.accessToken = token.accessToken as string; session.user.role = typeof token.role == "string" || Array.isArray(token.role) ? token.role : []; return session; }, }, session: { strategy: "jwt", }, }; const handler = NextAuth(authOptions); export { handler as GET, handler as POST };