Estoy usando @EnableOauth2Sso siguiendo una arquitectura similar a la descrita en el tutorial oauth2 de Spring: un servidor de autenticación, un proxy zuul que habilita el sso, una aplicación de interfaz de usuario separada, etc.
Auth server ---- Resource Server (Zuul app) ---- Angular UI AppEl problema es que cuando la interfaz de usuario cierra sesión en el servidor de recursos, elimina correctamente el JSESSIONID del servidor de recursos, luego se redirige al usuario a una página de inicio. Cuando el usuario quiere volver a iniciar sesión, se le redirige al servidor de autenticación, pero en lugar de solicitar el usuario y la contraseña, considera que todavía está conectado. El servidor de autenticación JSESSIONID todavía está allí y no se vio afectado por el cierre de sesión anterior del servidor de recursos.
¿Cómo podría también cerrar sesión en el servidor de autenticación?
Dado que no hay un cierre de sesión único de Spring OAuth2 listo para usar, tuvimos que solucionar esto creando un punto final / revocar que llama al servidor de autenticación para cerrar sesión:
interfaz de usuario:
$http({ method: 'POST', url: API + '/logout' }).then(function() { $http({ method: 'GET', url: API + '/auth/oauth/session/revoke' }).then(function() { window.location = '/'; }); });Servidor Zuul:
zuul: ... routes: authServer: path: /auth/** url: ${authServer.url}/auth/ ...Servidor de autenticación:
@RestController public class RevokeController { @RequestMapping(value = "/oauth/session/revoke", method = RequestMethod.GET) public void revoke(HttpServletRequest request) throws InvalidClientException { request.getSession().invalidate(); } }Este es el comportamiento correcto, cuando cierra la sesión de la aplicación Angular, no se cerrará la sesión del servidor de autenticación.
Ejemplo: - Supongamos que queremos iniciar sesión en stackoverflow.com usando una cuenta de google o facebook, no necesitamos ingresar la contraseña nuevamente, estamos iniciando sesión en el servicio de autenticación.
Si necesitamos mostrar el inicio de sesión de SSO una y otra vez, debemos cerrar la sesión de Angular UI y del servidor OAuth.