diff --git a/front/app/api/auth/[...nextauth]/route.ts b/front/app/api/auth/[...nextauth]/route.ts index 575431e..e17af22 100644 --- a/front/app/api/auth/[...nextauth]/route.ts +++ b/front/app/api/auth/[...nextauth]/route.ts @@ -11,33 +11,37 @@ export const authOptions: NextAuthOptions = { profile(profileData) { return { id: profileData.sub, - name: profileData.name || profileData.preferred_username, + first_name: profileData.given_name, + last_name: profileData.family_name, + username: 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 - : [], + role: profileData.realm_roles, }; }, }), ], callbacks: { async jwt({ token, account, profile }) { + console.log("Token", token); + console.log("Account", account); + console.log("Profile", 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; + token.first_name = profile.given_name; + token.last_name = profile.family_name; + token.username = profile.preferred_username; + token.role = profile.realm_roles; } 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 - : []; + session.user.first_name = token.first_name as string; + session.user.last_name = token.last_name as string; + session.user.username = token.username as string; + session.user.role = token.role as string[]; return session; }, }, diff --git a/front/components/main-nav.tsx b/front/components/main-nav.tsx index fe89ddc..4172030 100644 --- a/front/components/main-nav.tsx +++ b/front/components/main-nav.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { Calendar, MessageSquare, @@ -17,6 +17,8 @@ export function MainNav() { const [isSidebarOpen, setIsSidebarOpen] = useState(false); const { data: session } = useSession(); + console.log(session); + return ( <>
@@ -70,13 +72,25 @@ export function MainNav() {
-
- {session ? ( - {session.user.name} - ) : ( + {session ? ( +
+
+ + {session.user.first_name} {session.user.last_name} -{" "} + {session.user.role.includes("admin") ? "Admin" : ""} + {session.user.role.includes("TEACHERS") ? "Teacher" : ""} + {session.user.role.includes("STUDENTS") ? "Student" : ""} + +
+
+ Logout +
+
+ ) : ( +
Login - )} -
+
+ )} setIsSidebarOpen(false)} /> diff --git a/front/types/next-auth.d.ts b/front/types/next-auth.d.ts index ceb6b50..66950b2 100644 --- a/front/types/next-auth.d.ts +++ b/front/types/next-auth.d.ts @@ -3,13 +3,20 @@ import NextAuth, { DefaultSession, DefaultUser } from "next-auth"; declare module "next-auth" { interface Session { user: { - role?: string[] | string | null; + first_name: string; + last_name: string; + email: string; + username: string; + role: string[]; } & DefaultSession["user"]; accessToken?: string; } interface JWT { accessToken?: string; + first_name?: string; + last_name?: string; + username?: string; role?: string[] | string | null; } @@ -18,6 +25,9 @@ declare module "next-auth" { } interface Profile { - role?: string[] | string | null; + given_name: string; + family_name: string; + preferred_username: string; + realm_roles: string[]; } }