Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Encontre un error en el codigo

Cordial saludo, hoy vivi una experiencia enriquesedora pero compleja. resulta que realice el codigo al pie d ela letra de la clase con la particularidad que se me vencio el token ya que sali a almorzar, como el token lo valide para 1 hora gtm -5 se me venció y no arrancaba, validando me enviaba errores de vencimiento de token y al gen3erar uno nuevo recibia errores 500 con la ayuda de Luri identifique que para optimizar el código deje la clase SecurityFilter así :

package med.voll.api.infra.security;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import med.voll.api.domain.usuario.Usuariorepository; // Asegúrate de importar UsuarioRepository
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;

@Component
public class SecurityFilter extends OncePerRequestFilter {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private Usuariorepository usuarioRepository;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        var tokenJWT = recuperarToken(request);

        if (tokenJWT != null) {
            var subject = tokenService.getSubject(tokenJWT);
            var usuario = usuarioRepository.findByLogin(subject);
            System.out.println(subject);

            if (usuario != null) {
                var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
        filterChain.doFilter(request, response);
    }

    private String recuperarToken(HttpServletRequest request) {
        var authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader != null) {
            return authorizationHeader.replace("Bearer ", "");
        }
        return null;
    }
}

Gracias a estas modificaciones que evaluarn con un if quie el token sea diferente de null y aplicando una autenticacion logre correr. Luri me reconoció que luego del vencimiento del token hay un error de implementeacion una vez se vence el token con el Header del mismo.

mil gracias por esta experiencia. quiero aprender mas por mi bienestar

1 respuesta

¡Hola Edwin!

Gracias por compartir tu experiencia, parece que has estado trabajando duro para resolver este problema. Lo que describes suena como un problema común cuando se trabaja con autenticación basada en tokens, especialmente cuando los tokens expiran.

El error 500 que mencionas al generar un nuevo token podría estar relacionado con cómo estás manejando la expiración del token y la autenticación posterior. Aquí hay algunas cosas que podrías considerar revisar o ajustar:

  1. Manejo de Tokens Expirados: Asegúrate de que tu aplicación maneje adecuadamente los tokens expirados. Cuando un token expira, deberías recibir una respuesta clara que indique que el token no es válido y que se necesita uno nuevo. Esto puede implicar capturar excepciones específicas relacionadas con la expiración del token y responder con un código de estado HTTP adecuado, como 401 Unauthorized.

  2. Generación de Nuevos Tokens: Verifica que el proceso de generación de nuevos tokens esté funcionando correctamente. Si estás recibiendo un error 500, es posible que haya un problema en el código que maneja la creación de tokens. Revisa los logs para ver si hay más detalles sobre el error.

  3. Validación del Token: En tu clase SecurityFilter, asegúrate de que el token se valide correctamente antes de intentar autenticar al usuario. Esto significa que debes verificar que el token no esté expirado y que sea válido antes de proceder con la autenticación.

  4. Logs y Debugging: Asegúrate de tener suficiente logging en tu aplicación para poder rastrear qué está sucediendo cuando intentas autenticarte con un nuevo token. Esto puede ayudarte a identificar si el problema está en la validación del token, en la autenticación del usuario, o en otro lugar.

Aquí tienes un ejemplo de cómo podrías manejar la validación del token:

if (tokenJWT != null && tokenService.isValid(tokenJWT)) {
    var subject = tokenService.getSubject(tokenJWT);
    var usuario = usuarioRepository.findByLogin(subject);

    if (usuario != null) {
        var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }
}

En este ejemplo, tokenService.isValid(tokenJWT) es un método que deberías implementar para verificar si el token es válido y no ha expirado.

Espero que estas sugerencias sean útiles y te ayuden a resolver el problema. ¡Bons estudos!