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)?
davy.ai
Solución para invalidar el Token de OAuth al desloguearse
Para invalidar el token de OAuth al desloguearse, existen dos enfoques:
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
yRestTemplate
proporcionados por Spring.Aquí, se crea un
TwitchController
con unRestTemplate
, que se utiliza para enviar la solicitud POST a la API de Twitch para revocar el token. El objetoOAuth2AuthorizedClient
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
:Aquí, se agrega un método
logout()
aHttpSecurity
que establece los métodosclearAuthentication()
ydeleteCookies()
entrue
. Esto borrará el token y las cookies del usuario al desloguearse.Tenga en cuenta que en el método
deleteCookies()
, se utiliza la cookieJSESSIONIDSSO
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 cookieJSESSIONIDSSO
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 aSpringSecurityConfiguration
:Aquí, se agrega un
CustomAuthorizationRequestResolver
al métodoauthorizationRequestResolver()
del objetooauth2Login()
. Este resolver toma elclientRegistrationRepository()
y una URL con el parámetroprompt=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.