es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Forzar al Usuario a Volver a Ingresar las Credenciales de Oauth Después de Cerrar la Sesión | Spring Security

Tengo una aplicación Spring que está asegurada usando Oauth proporcionado por Twitch. Lo que estoy tratando de hacer es que cuando el usuario hace clic en el botón de cierre de sesión, tenga que volver a ingresar sus credenciales de Twitch para volver a iniciar sesión en el sitio. Según la lectura que he hecho, mi comprensión de la situación es que es bastante difícil lograr el cierre de sesión único con Oauth. Dicho esto, la API de Twitch parece indicar que hay una forma de decirles que invaliden un token de Oauth: https://dev.twitch.tv/docs/authentication#revoking-access-tokens.

He visto alguna información sobre un parámetro prompt=login en OIDC, pero no he podido encontrar ninguna información al respecto ni cómo usarlo (además de que estoy bastante seguro de que requerirá que los usuarios vuelvan a ingresar sus credenciales todas las veces en lugar de simplemente cuando cierran sesión).

Mi enfoque inicial para este problema fue la respuesta número 1 en este hilo, pero eso no cambió nada. Todavía no me pedían que ingresara mis credenciales al intentar acceder a uno de los endpoints restringidos, Spring simplemente volvió a autenticarse rápidamente con Twitch y me envió.

Mi enfoque actual fue golpear directamente el endpoint en la API de Twitch con una solicitud POST (esto fue inspirado por un comentario en este hilo). Este enfoque tampoco está haciendo nada. Incluiré el código de ese enfoque a continuación.

Preferiría solucionar este problema con algo integrado en Spring (manteniendo la esperanza de que haya algo que haya perdido). Algo interesante que he estado notando sucediendo es que cuando golpeo /logout, mi navegador se redirige al endpoint de autorización de Twitch, lo que me hace pensar que por alguna razón Spring está tratando de enviar una solicitud de revocación de token al endpoint de autorización O está iniciando sesión de nuevo en el endpoint tan pronto como cierro sesión en él. Pensé que valía la pena mencionarlo.

Cualquier ayuda para replicar el comportamiento mencionado inicialmente sería muy apreciada.

SpringSecurityConfiguration: …

application.properties: …

TokenRemovalController: …

Estructura del proyecto: …

Otra cosa que olvidé mencionar fue que si elimino todas las cookies de mi navegador, luego cerrar sesión de mi sitio. ¿Es posible replicar este efecto cuando los usuarios intentan cerrar sesión (obviamente sin eliminar todas las demás cookies de los usuarios)?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para invalidar el Token de OAuth al desloguearse

    Para invalidar el token de OAuth al desloguearse, existen dos enfoques:

    1. Usando la API de Twitch para revocar el token mediante una solicitud POST.
    2. Configurando Spring Security para borrar el token y las cookies.

    Usando la API de Twitch para revocar el Token

    Una forma de invalidar el token de OAuth al desloguearse es hacer una solicitud POST a la API de Twitch para revocar el token. Esto se puede hacer creando un controlador que llame a la API de Twitch mediante los objetos OAuth2AuthorizedClient y RestTemplate proporcionados por Spring.

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
    import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class TwitchController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @PostMapping("/logout")
        public void logout(@RegisteredOAuth2AuthorizedClient("twitch") OAuth2AuthorizedClient client) {
            restTemplate.postForObject("https://id.twitch.tv/oauth2/revoke?client_id={clientId}&token={accessToken}",
                    null, String.class, client.getClientRegistration().getClientId(), client.getAccessToken().getTokenValue());
        }
    
    }
    

    Aquí, se crea un TwitchController con un RestTemplate, que se utiliza para enviar la solicitud POST a la API de Twitch para revocar el token. El objeto OAuth2AuthorizedClient es inyectado por Spring y contiene el token del usuario actual.

    Configurando Spring Security para borrar el Token y las Cookies

    Otro enfoque para invalidar el token de OAuth al desloguearse es simplemente borrar el token y las cookies en la configuración de Spring Security al desloguearse. Esto se puede hacer agregando el siguiente código a SpringSecurityConfiguration:

    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @EnableWebSecurity
    public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/", "/Info", "/token/deletion")
                    .permitAll()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .oauth2Login()
                    .and()
                    .logout()
                    .logoutSuccessUrl("/")
                    .clearAuthentication(true)
                    .deleteCookies("JSESSIONID", "JSESSIONIDSSO");
        }
    
    }
    

    Aquí, se agrega un método logout() a HttpSecurity que establece los métodos clearAuthentication() y deleteCookies() en true. Esto borrará el token y las cookies del usuario al desloguearse.

    Tenga en cuenta que en el método deleteCookies(), se utiliza la cookie JSESSIONIDSSO para invalidar la sesión del usuario. Esto se debe a que, por defecto, Spring Security usa Single Sign-On (SSO) para mantener a los usuarios conectados en varios clientes. Al borrar la cookie JSESSIONIDSSO al desloguearse, invalidamos la sesión de SSO del usuario.

    Solicitar credenciales en el inicio de sesión

    Para solicitar las credenciales a los usuarios en cada inicio de sesión, podemos agregar el parámetro prompt=login a la solicitud de autorización. Esto indica al servidor de autorización que solicite las credenciales del usuario, incluso si tienen un token válido.

    Para agregar el parámetro prompt=login a la solicitud de autorización, podemos agregar el siguiente código a SpringSecurityConfiguration:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/", "/Info", "/token/deletion")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .oauth2Login()
                .authorizationEndpoint()
                .baseUri("/oauth2/authorize")
                .authorizationRequestResolver(
                        new CustomAuthorizationRequestResolver(
                                clientRegistrationRepository(),
                                UriComponentsBuilder.fromHttpUrl("https://id.twitch.tv/oauth2/authorize").queryParam("prompt", "login").build().toUriString()
                        )
                )
                .and()
                .logout()
                .logoutSuccessUrl("/")
                .clearAuthentication(true)
                .deleteCookies("JSESSIONID", "JSESSIONIDSSO");
    }
    

    Aquí, se agrega un CustomAuthorizationRequestResolver al método authorizationRequestResolver() del objeto oauth2Login(). Este resolver toma el clientRegistrationRepository() y una URL con el parámetro prompt=login como argumentos. Cada vez que un usuario intenta iniciar sesión, el resolver usará esta URL para solicitar la autorización de la API de Twitch, lo que solicitará las credenciales del usuario.

    Tenga en cuenta que esto desactivará Single Sign-On, ya que siempre se solicitan las credenciales del usuario. Si desea mantener habilitado Single Sign-On, deberá encontrar otra manera de solicitar las credenciales solo al desloguearse.

Comments are closed.