Cómo cerrar sesión correctamente en un proyecto Vaadin Fusion 22 sin estado con oauth2.
Configuré un proyecto para que sea sin estado de acuerdo con esta documentación https://vaadin.com/docs/latest/fusion/security/spring-stateless
Configuración de autorización a través de Keycloak:
@Override
protected void configure(HttpSecurity http) throws Exception {
// Establece la política de seguridad predeterminada que permite las solicitudes internas de Vaadin y deniega todo lo demás
super.configure(http);
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http
// Habilita el inicio de sesión de OAuth2
.oauth2Login(oauth2Login -> oauth2Login.clientRegistrationRepository(clientRegistrationRepository)
.userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint
// Use un autoridades de asignación personalizada para obtener los roles del proveedor de identidad
// en el token de autenticación
.userAuthoritiesMapper(authoritiesMapper))
// Use un controlador de éxito de autenticación consciente de Vaadin
.successHandler(new VaadinSavedRequestAwareAuthenticationSuccessHandler()))
// Configura el cierre de sesión
.logout(logout -> logout
.logoutSuccessHandler(logoutSuccessHandler())
.logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET")));
setStatelessAuthentication(http,
new SecretKeySpec(Base64.getDecoder().decode(authSecret),
JwsAlgorithms.HS256),
"com.my.app");
}
private OidcClientInitiatedLogoutSuccessHandler logoutSuccessHandler() {
OidcClientInitiatedLogoutSuccessHandler logoutSuccessHandler = new
OidcClientInitiatedLogoutSuccessHandler(
clientRegistrationRepository);
logoutSuccessHandler.setPostLogoutRedirectUri("{baseUrl}/");
return logoutSuccessHandler;
}
La autenticación funciona correctamente, podemos ver los tokens jwt en las cookies https://i.stack.imgur.com/8cShO.png
Pero cuando hago clic en el botón de cierre de sesión, todavía estoy conectado.
Hay una función de cierre de sesión como se describe aquí https://vaadin.com/docs/latest/fusion/security/authentication-offline/#removing-an-expired-authentication
export async function logout() {
setSessionExpired();
await logoutImpl();
appStore.clearUserInfo();
location.href = '/logout';
}
davy.ai
Problema con la función de cierre de sesión en proyecto Vaadin Fusion configurado para ser sin estado
Soy un experto en informática especializado en Vaadin, Vaadin-Fusion, Vaadin22 y Hilla. Según la documentación proporcionada en https://vaadin.com/docs/latest/fusion/security/spring-stateless, he configurado un proyecto Vaadin Fusion para que sea sin estado. El proyecto también está autorizado con Keycloak.
La autenticación ha estado funcionando bien y puedo ver los tokens JWT en las cookies, pero cuando hago clic en el botón de cierre de sesión, sigo conectado. Parece haber un problema con la función de cierre de sesión.
La documentación en https://vaadin.com/docs/latest/fusion/security/authentication-offline/#removing-an-expired-authentication explica cómo eliminar una autenticación expirada. Sugiero probar el siguiente código para rectificar el problema:
Por favor, pruebe el código anterior y verifique si se resuelve el problema.