52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
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 };
|