Solucionado (ver solución)
Solucionado
(ver solución)
4
respuestas

El token enviado no es valido spring security

buenas compañeros tengo este problema, segui todo el paso del curso aplica las mejores practicas, clase 5, validando token y todo me iba bien hasta que me salio error java.lang.RuntimeException: El token enviado no es valido y en insomnia me sale error 403, en todo lo que haga, quiero mandar un post para logearme y me sale tambien eso error 403 y en spring me sale

java.lang.RuntimeException: El token enviado no es valido
    at med.voll.api.infra.security.SecurityFilter.doFilterInternal(SecurityFilter.java:25) ~[classes/:na]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.12.jar:6.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.13.jar:10.1.13]

dejo mi codigo quiero aclarar que buscando informacion para componer el error modifique un poco el codigo

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidadIngrese aquí la descripción de esta imagen para ayudar con la accesibilidadIngrese aquí la descripción de esta imagen para ayudar con la accesibilidad

no puedo ni logiaIngrese aquí la descripción de esta imagen para ayudar con la accesibilidad rme para poder sacar un token me sale todo error 403

4 respuestas

Que tal, yo tuve el mismo problema, en mi caso la solución vino de corregir el código dentro del SecurityFilter, especificamente dentro de "doFilterInternal", en mi caso no había refactorizado la variable "subject" a "nombreUsuario", por lo que al realizar la compilación se creaba un problema al generar el token, una vez que modifique esa parte el código me corrio sin problemas, espero esto te ayude.

Saludos.

hola Daniel saludos, mira estaba revisando lo que me comentas y la variable "subject " no la tengo en "doFilterInternal" te comparto mi código para que revises quizá hice algo mal

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 org.springframework.beans.factory.annotation.Autowired;
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;
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // obtener el token del header
        var token = request.getHeader("Authorization");
        if (token == null || token.equals("") ) {
            throw new RuntimeException("El token enviado no es valido");
        }
        token = token.replace("Bearer","");
        System.out.println(token);
        System.out.println(tokenService.getSubject(token));

        filterChain.doFilter(request,response);
    }
}

ahora trato de hacer el post para logiar

{
    "login": "irving.valencia",
    "clave": "123456"
}

mi ruta = http://localhost:8080/login segun esta deberia permitirme pues tengo guardado el login y clave para poder sacar un token pero me lo toma directamente a que el token no es valido

package med.voll.api.infra.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfigurations  {



    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().authorizeHttpRequests()
                .requestMatchers(HttpMethod.POST, "/login").permitAll()
                .anyRequest().authenticated()
                .and().build();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }


    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}
solución!

Hola, tuve el mismo problema, el error estaba que ya se me habia expirado el token.

        return LocalDateTime.now().plusHours(2).toInstant(ZoneOffset.of("-05:00"));
    }

Igual que en la clase le asigne 2 horas, e investigando descubri que se debe generar un nuevo token, antes que expire el anterior.

Mi solucion fue ejecutar la clase "SecurityFilter" solo con la linea siguiente

@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        //Obtener los Token del Header
        filterChain.doFilter(request, response);
    }

ir a Insomnia, hacer login con el metod POST, copia el nuevo token y lo pegas en "AUTH TYPE" en token, y ya te estara trabajando bien, solo debes volver a dejar como estaba la clase "SecurityFilter".

Espero haberte ayudado, SUERTE!!

Muchas Gracias Eduardo, me ayudaste a entender la secuencia que se debe hacer para no prensentar ningun error :)