Ajout de la gestion du refresh token lors de la connexion avec Keycloak et mise à jour de la déconnexion pour utiliser le refresh token. Modification de la navigation principale pour intégrer les fonctions de connexion et de déconnexion.

This commit is contained in:
Kevin 2025-02-21 14:25:52 +01:00
parent 92c451efe5
commit 6018b853a0
2 changed files with 30 additions and 4 deletions

View File

@ -28,6 +28,7 @@ export const authOptions: NextAuthOptions = {
// 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.refreshToken = account.refresh_token;
token.first_name = profile.given_name;
token.last_name = profile.family_name;
token.username = profile.preferred_username;
@ -48,6 +49,29 @@ export const authOptions: NextAuthOptions = {
session: {
strategy: "jwt",
},
events: {
async signOut({ token }) {
try {
console.log("Déconnexion Keycloak");
console.log("Token", token);
const issuerUrl = process.env.KEYCLOAK_ISSUER!;
const logoutUrl = `${issuerUrl}/protocol/openid-connect/logout`;
await fetch(logoutUrl, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: new URLSearchParams({
client_id: process.env.KEYCLOAK_CLIENT_ID!,
client_secret: process.env.KEYCLOAK_CLIENT_SECRET!,
refresh_token: token.refreshToken as string,
}),
});
} catch (error) {
console.error("Erreur lors de la déconnexion Keycloak:", error);
}
},
},
};
const handler = NextAuth(authOptions);

View File

@ -1,6 +1,6 @@
"use client";
import { useEffect, useState } from "react";
import { useState } from "react";
import {
Calendar,
MessageSquare,
@ -11,7 +11,7 @@ import {
import Image from "next/image";
import Link from "next/link";
import { Sidebar } from "./sidebar";
import { useSession } from "next-auth/react";
import { useSession, signIn, signOut } from "next-auth/react";
export function MainNav() {
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
@ -83,12 +83,14 @@ export function MainNav() {
</span>
</div>
<div className='cursor-pointer text-white/80 hover:text-white'>
<Link href='/api/auth/signout'>Logout</Link>
<span onClick={() => signOut()}>Logout</span>
</div>
</div>
) : (
<div className='cursor-pointer text-white/80 hover:text-white'>
<Link href='/api/auth/signin'>Login</Link>
<span onClick={() => signIn("keycloak", { callbackUrl: "/" })}>
Login
</span>
</div>
)}
</div>