58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
"use client";
|
|
|
|
import { useEffect } from "react";
|
|
import { signOut, useSession } from "next-auth/react";
|
|
import { clearAuthCookies } from "@/lib/session";
|
|
|
|
export function SignOutHandler() {
|
|
const { data: session } = useSession();
|
|
|
|
useEffect(() => {
|
|
const handleSignOut = async () => {
|
|
try {
|
|
// Clear all auth-related cookies
|
|
clearAuthCookies();
|
|
|
|
// First sign out from NextAuth with redirect false
|
|
await signOut({
|
|
redirect: false
|
|
});
|
|
|
|
// Then redirect to Keycloak logout with proper parameters
|
|
if (process.env.NEXT_PUBLIC_KEYCLOAK_ISSUER) {
|
|
const keycloakLogoutUrl = new URL(
|
|
`${process.env.NEXT_PUBLIC_KEYCLOAK_ISSUER}/protocol/openid-connect/logout`
|
|
);
|
|
|
|
// Add required parameters
|
|
keycloakLogoutUrl.searchParams.append(
|
|
'post_logout_redirect_uri',
|
|
`${window.location.origin}/signin?signedOut=true`
|
|
);
|
|
|
|
// Add id_token_hint if available
|
|
if (session?.accessToken) {
|
|
keycloakLogoutUrl.searchParams.append(
|
|
'id_token_hint',
|
|
session.accessToken
|
|
);
|
|
}
|
|
|
|
// Redirect to Keycloak logout
|
|
window.location.href = keycloakLogoutUrl.toString();
|
|
} else {
|
|
// Fallback if no Keycloak issuer is configured
|
|
window.location.href = '/signin?signedOut=true';
|
|
}
|
|
} catch (error) {
|
|
console.error('Error during logout:', error);
|
|
// Fallback if something goes wrong
|
|
window.location.href = '/signin?signedOut=true';
|
|
}
|
|
};
|
|
|
|
handleSignOut();
|
|
}, [session]);
|
|
|
|
return null;
|
|
}
|