2
respuestas

Forbidden 402 al crear el token

hola buenas noches. me esta saliendo forbidden 403 en el momento de generar el token, que podria pasar?

en el video en el momento que el profesor hace el siguiente codigo:

@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        var authHeader = request.getHeader("AUTHORIZATION");
        if (authHeader != null){
            var token = authHeader.replace("Bearer ", "");
            var subject = tokenService.getSubject(token);
            if (subject != null){
                var usuario = usuarioRepository.findByLogin(subject);
                var authentication = new UsernamePasswordAuthenticationToken(usuario, null,
                        usuario.getAuthorities()); // forzamos un inicio de sesion
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
        filterChain.doFilter(request, response);
    }
}

la linea de codigo donde aparece filterChain.doFilter(request, response); lo tiene dentro del if y en insomnia muesta 200 solmante sin mostrar el token pero luego el lo saca del if y ahi si le muestra el toke PERO A MI NOOO me muesta un error 403 y no me explico porque, espero me puedan ayudar pronto. gracias

2 respuestas

Hola Danny,

¿Ha podido resolver el problema? El error con Forbidden al intentar generar un token generalmente indica que el servidor entendió la solicitud, pero se niega a autorizarla. Y parece un problema relacionado con la autenticación o los permisos del usuario.

Verifica el usuario para generar el token con los permisos necesarios. Asegúrate de que estás enviando correctamente el encabezado de autorización con tu solicitud. Debe ser algo como "Authorization: Bearer tu_token". Revisa que el token que estás utilizando es válido. Puede que el token haya expirado o que no sea correcto.

Sin embargo, el método doFilterInternal se encarga de procesar la solicitud y generar la respuesta. La línea de código filterChain.doFilter(request, response); debería estar fuera del if, ya que esta línea permite que la solicitud continúe su camino a través del filtro de seguridad.

Además, revises los logs de tu aplicación para ver si hay mensajes de error que te pueda dar más información sobre lo que está sucediendo.

Espero que estas sugerencias te sean de ayuda. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

A mi me pasa lo mismo y en los logs solo me aparece esto:

2023-10-01T19:11:47.741+09:00 WARN 15892 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/octet-stream' is not supported]

No enntiendo porque da ese error.

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.usuarios.UsuarioRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UserDetailsRepositoryReactiveAuthenticationManager;
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 {
        // Obtener el token del header
        var authHeader = request.getHeader("Authorization");
        if (authHeader != null) {
            var token = authHeader.replace("Bearer ", "");
            var nombreUsuario = tokenService.getSubject(token); // extract username
            if (nombreUsuario != null) {
                // Token valido
                var usuario = usuarioRepository.findByLogin(nombreUsuario);
                var authentication = new UsernamePasswordAuthenticationToken(usuario, null,
                        usuario.getAuthorities()); // Forzamos un inicio de sesion
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
        filterChain.doFilter(request, response);
    }
}

Este es el codigo que tengo.