Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
0
respuestas

[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;
    }
}