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

[Duda] Desafio ForoHub

Estoy usando en mi proyecto ForoHub JWT, pero al realizar mi solicitud del login en Insomnia me resulta un error 403.

package com.foro.infra.security;

import...

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

    @Autowired
    private SecurityFilter securityFilter;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .csrf(csrf ->csrf.disable())
                .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(req -> {
                    req.requestMatchers(HttpMethod.POST, "/login").permitAll();
                    req.anyRequest().authenticated();
                        })
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

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

    @Bean
    public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

package com.foro.infra.security;

import...

@Service
public class TokenService {

@Value("${api.security.secret}")
private String apiSecret;

private SecretKey getKey() {
    return Keys.hmacShaKeyFor(apiSecret.getBytes(StandardCharsets.UTF_8));
}

public String generarToken(Usuario usuario) {
    return Jwts.builder()
            .setSubject(usuario.getCorreoElectronico())
            .setIssuedAt(new Date())
            .setExpiration(Date.from(Instant.now().plus(2, ChronoUnit.HOURS)))
            .signWith(getKey(), SignatureAlgorithm.HS256)
            .compact();
}

public String getSubject(String token) {
    if (token == null) throw new RuntimeException("Token vacío");

    return Jwts.parserBuilder()
            .setSigningKey(getKey())
            .build()
            .parseClaimsJws(token)
            .getBody()
            .getSubject();
}

}

import...

@Component
public class SecurityFilter extends OncePerRequestFilter {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private UsuarioRepository repository;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        String tokenJWT = recuperarToken(request);

        if (tokenJWT != null) {
            String correo = tokenService.getSubject(tokenJWT);

            var optionalUsuario = repository.findByCorreoElectronico(correo);

            if (correo != null && optionalUsuario.isPresent()) {
                var usuario = optionalUsuario.get();

                var auth = new UsernamePasswordAuthenticationToken(
                        usuario, null, usuario.getAuthorities()
                );

                SecurityContextHolder.getContext().setAuthentication(auth);
            }
        }

        filterChain.doFilter(request, response);
    }


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

1 respuesta

¡Hola Estudiante, espero que estés bien!

Parece que estás teniendo problemas con un error 403 al intentar realizar una solicitud de login usando JWT en tu proyecto ForoHub. El error 403 generalmente indica que el servidor está rechazando la solicitud debido a problemas de autorización. Aquí hay algunas cosas que podrías verificar para solucionar este problema:

  1. Verifica la Configuración de Seguridad: Asegúrate de que la ruta /login esté correctamente configurada para permitir el acceso sin autenticación. Según tu configuración, parece que está bien, pero asegúrate de que no haya otras configuraciones que puedan estar afectando.

  2. Revisa el Token JWT: Asegúrate de que el token JWT esté siendo generado y enviado correctamente. Puedes verificar el token usando herramientas como jwt.io para asegurarte de que el payload y la firma sean correctos.

  3. Cabecera de Autorización: Asegúrate de que estás enviando el token JWT en la cabecera de autorización de la solicitud con el prefijo "Bearer ". Por ejemplo:

    Authorization: Bearer tu_token_jwt_aquí
    
  4. Secret Key: Verifica que la clave secreta (api.security.secret) esté correctamente configurada y sea la misma tanto al generar como al validar el token.

  5. Logs y Excepciones: Revisa los logs del servidor para ver si hay más detalles sobre por qué se está produciendo el error 403. Puede haber excepciones o mensajes de error que te den más pistas.

  6. Revisa el Usuario y su Autorización: Asegúrate de que el usuario esté correctamente almacenado en la base de datos y que tenga los roles o permisos necesarios.

Espero que estas sugerencias te ayuden a resolver el problema. ¡Bons estudios!