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

Forbidden 403 pruebas con proyecto, Foro Alura

Tengo en mi github este proyecto del reto, Foro Alura, https://github.com/zygarte/Foro-Alura--Challenge-ONE-Java

Ya he ajustado en lo posible el código, pero al probarlo obtengo esto:

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

en este caso la consola recibe:

com.alura.foro.dominio.usuario.Usuario@21 Hibernate: select u1_0.id, u1_0.contraseña, u1_0.email, u1_0.nombre from usuarios u1_0 where u1_0.nombre=?

También esto: Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

En la consola obtengo: El filtro esta siendo llamado

No es posible realizar las demás pruebas requeridas, si no puedo obtener los token de la aplicacion cuando se esta ejecutando, se supone que puedes obtenerlos si seguiste la teoria de la clase.

estoy bien perdido, se supone que los post asociados a login deberian estar exentos del bloqueo, ya que usando el login puedes acceder a los JWT token

¿Donde esta el error?

2 respuestas

Hola William,

Por lo que veo en tu descripción, parece que estás teniendo problemas con la autenticación y estás recibiendo un error 403 Forbidden. Este error generalmente indica que el servidor comprende la solicitud, pero se niega a autorizarla.

El error 403 puede surgir debido a varias razones, pero en tu caso, parece que podría estar relacionado con la autenticación JWT. Asegúrate de que estás generando y enviando el token JWT correctamente.

Por ejemplo, cuando haces una solicitud POST para iniciar sesión, tu servidor debe generar un token JWT y devolverlo en la respuesta. Luego, para las solicitudes autenticadas, debes incluir este token en el encabezado 'Authorization' de tu solicitud.

Aquí tienes un ejemplo de cómo podrías hacer esto:

// Generar token
String token = Jwts.builder().setSubject(usuario.getId().toString()).signWith(SignatureAlgorithm.HS512, "clave secreta").compact();

// Enviar token
response.addHeader("Authorization", "Bearer " + token);

Y luego, para las solicitudes autenticadas:

// Incluir token en el encabezado de la solicitud
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + token);
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

restTemplate.exchange(url, HttpMethod.GET, entity, String.class);

Además, asegúrate de que tu filtro está configurado correctamente para permitir las solicitudes de inicio de sesión y verificar los tokens en las demás solicitudes.

Espero que esto te dé una idea de por dónde empezar a buscar el problema. Recuerda, este es solo un ejemplo y puede que necesites ajustarlo según tu implementación específica.

Espero haber ayudado y buenos estudios!

Tengo este codigo que se ejecuta cada vez que realizo una peticion, como del tipo post:


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 {
        System.out.println("El filtro esta siendo llamado");
        
        var authHeader = request.getHeader("Authorization");
        System.out.println(authHeader.replace("Bearer ", ""));
        if (authHeader != null) {
            var token = authHeader.replace("Bearer ", "");
            var nombreUsuario = tokenService.getSubject(token);
            if (nombreUsuario != null) {
                // Token Válido
                var usuario = usuarioRepository.findByNombre(nombreUsuario);
                System.out.println(usuario);
                // Forzamos Inicio de sesión
                var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
        filterChain.doFilter(request, response);
    }
}

esta linea "System.out.println(authHeader.replace("Bearer ", ""));" deberia darme alguna info, despues de todo si no es null se realiza el proceso posterior

Aqui está el codigo de TokenService y UsuarioRepository


@Service
public class TokenService {

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

    public String generarToken(Usuario usuario) {
        try {
            var algoritmo = Algorithm.HMAC256(secret);
            return JWT.create()
                    .withIssuer("Foro Challenge")
                    .withSubject(usuario.getNombre())
                    .withExpiresAt(fechaExpiracion())
                    .sign(algoritmo);
        } catch (JWTCreationException exception){
            throw new RuntimeException("Error al generar el token JWT", exception);
        }
    }

    public String getSubject(String token) {
        
        System.out.println(token);
        
        try {
            var algoritmo = Algorithm.HMAC256(secret);
            return JWT.require(algoritmo)
                    .withIssuer("Foro Challenge")
                    .build()
                    .verify(token)
                    .getSubject();
        } catch (JWTVerificationException exception) {

            throw new RuntimeException("Token JWT inválido o expirado! " + exception.getMessage());
        }
    }

    private Instant fechaExpiracion() {
        return LocalDateTime.now().plusHours(2).toInstant(ZoneOffset.of("-03:00"));
    }

}

public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
    UserDetails findByNombre(String username);
}

¿donde estaria perdiendo el token?