Estoy considerando usar OAuth2 para mi aplicación. La arquitectura que estoy tratando de implementar es la siguiente:
Hasta ahora he logrado implementar esta interacción entre 3 aplicaciones básicas (1 servidor de autenticación, 1 servidor de recursos y 1 cliente). Lo que no funciona es la funcionalidad de cierre de sesión. He leído sobre el "problema notoriamente complicado" que Dave Syer describe en su tutorial, pero en este caso realmente necesito que el usuario vuelva a iniciar sesión después de cerrar la sesión. Intenté otorgar unos segundos al token de acceso y al token de actualización, pero en lugar de que se me pida que inicie sesión nuevamente cuando llegue el vencimiento, recibo un NPE en la aplicación del cliente. También probé las soluciones propuestas en esta publicación para eliminar el token de la tienda de tokens, pero no funciona. Para mí, el cierre de sesión único es el comportamiento deseable para esta implementación. ¿Cómo puedo lograr esto usando Spring Boot Oauth2. Si no es posible por alguna razón, ¿qué alternativas podría usar para implementar una seguridad centralizada usando Spring Boot?
Gracias por adelantado.
Después de muchas pruebas, me di cuenta de que esto se puede resolver simplemente con una redirección al AuthServer y haciendo el cierre de sesión mediante programación de esta manera:
En la aplicación cliente (WebSecurityConfigurerAdapter):
@Override protected void configure(HttpSecurity http) throws Exception { http .logout() .logoutSuccessUrl("http://your-auth-server/exit"); }
En el servidor de autorización:
@Controller public class LogoutController { @RequestMapping("/exit") public void exit(HttpServletRequest request, HttpServletResponse response) { // token can be revoked here if needed new SecurityContextLogoutHandler().logout(request, null, null); try { //sending back to client app response.sendRedirect(request.getHeader("referer")); } catch (IOException e) { e.printStackTrace(); } } }
He publicado una aplicación de muestra en github con un ejemplo completo de esta implementación.