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

[Bug] [The input is not a valid base 64 encoded string.]

Buenas noches, tengo un problema ya que en el codigo yo hago todo lo que el profesor nos dijo pero me sale el siguiente error

Hibernate: select u1_0.id,u1_0.clave,u1_0.usuario from usuarios u1_0 where u1_0.usuario=?
com.auth0.jwt.exceptions.JWTDecodeException: The input is not a valid base 64 encoded string.
2024-06-21T00:08:42.983-06:00 ERROR 17372 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.NullPointerException: Cannot invoke "com.auth0.jwt.interfaces.DecodedJWT.getSubject()" because "verifier" is null
    at med.voll.api.security.TokenServices.getSubject(TokenServices.java:53) ~[classes/:na]
    at med.voll.api.security.FilterSegurity.doFilterInternal(FilterSegurity.java:32) ~[classes/:na]

Ya estuve revisando el repositorio del proyecto final para ver si me había faltado algun tipo de anotación o un variable que no estuviera inicializando pero todo esta correcto, dejo el codigo de las 2 clases que tira donde supuestamente esta el error, espero que me puedan ayudar porque ya llevo bastante con el error y no se como solucionarlo.

6 respuestas

[TokenServices]

package med.voll.api.security;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.Value;
import med.voll.api.usuario.Usuario;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;

@Service
public class TokenServices {
     private String secret = "123456";
     private String IssuserA = "voll med";
     public String generarToken(Usuario usuario){
          try {
               Algorithm algorithm = Algorithm.HMAC256(secret);
               return JWT.create()
                       .withIssuer(IssuserA)
                       .withSubject(String.valueOf(usuario.getId()))
                       .withClaim("id", usuario.getId())
                       .withExpiresAt(generarFechaExpiracion())
                       .sign(algorithm);
          } catch (JWTCreationException exception){
               throw new RuntimeException("Error al generar el Token");
               // Invalid Signing configuration / Couldn't convert Claims.
          }
     }
     public String getSubject(String token){
          DecodedJWT verifier = null;
          try {
               Algorithm algorithm = Algorithm.HMAC256(secret);
               verifier = JWT.require(algorithm)
                       // specify any specific claim validations
                       .withIssuer(IssuserA)
                       .build()
                       .verify(token);
                verifier.getSubject();
          } catch (JWTVerificationException exception){
               // Invalid signature/claims
               System.out.println(exception.toString());
          }
          if (verifier.getSubject() == null){
               throw new RuntimeException("Verificacion Invalida");
          }
          return verifier.getSubject();
     }
     private Instant generarFechaExpiracion(){
          return LocalDateTime.now().plusHours(2).toInstant(ZoneOffset.of("-05:00"));
     }
}

[FilterSegurity]

package med.voll.api.security;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import med.voll.api.usuario.UsuariosRepository;
import org.springframework.beans.factory.annotation.Autowired;
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;
import java.util.logging.Filter;

@Component
public class FilterSegurity extends OncePerRequestFilter {
    @Autowired
    private TokenServices tokenServices;
    @Autowired
    private UsuariosRepository usuariosRepository;
    @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 = tokenServices.getSubject(token);
            if (Subject != null ){
                var usuario = usuariosRepository.findByUsuario(Subject); //Forzamos el inicio de seccion
                var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }

        }
        filterChain.doFilter(request, response);
    }
}

Buenas! tengo el mismo error y no he podido solucionarlo, pero por lo que veo en tu código, el error puede estar esta linea: var token = AuthHeader.replace("Bearer", ""); deberias dejar espacio luego de Bearer, así: "Bearer ", espero eso solucione tu problema... Ahora, yo tengo el mismo problema, no sé si usar este mismo hilo para postear mi código o debo abrir otro para no confundir...

Buenso dias, si en lo que pasa es que el Token que crea la misma clase no es válido cuando se Intenta verificar, pero ya lo verifique en plataformas si el tomen es valido y me salieron que si lo es, y de aquí no se que mas hacer y gracias por la sugerencia voy a intentar lo que me sugerio.

[ Carolina Lucero] Buenos dias realice la sugeria que me dijo y ahora me sale otro error jaja ahora si ya valida el Token correctamente, pero como le digo ahra salta otro error estare intentando verificar si puedo ver comoo solucionarlo y como siempre gracias

[ERROR]

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaXNzIjoidm9sbCBtZWQiLCJpZCI6MSwiZXhwIjoxNzE4OTg5NTAzfQ.Q3qwoX9QF8CzSZ4n-XWbS285UacdZ5RmUqYLpmzstnA
Hibernate: select u1_0.id,u1_0.clave,u1_0.usuario from usuarios u1_0 where u1_0.usuario=?
2024-06-21T10:05:31.454-06:00 ERROR 13352 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.NullPointerException: Cannot invoke "org.springframework.security.core.userdetails.UserDetails.getAuthorities()" because "usuario" is null
    at med.voll.api.security.FilterSegurity.doFilterInternal(FilterSegurity.java:36) ~[classes/:na]

Gracias Carolina Lucero, me sirvió de mucho tu sugerencia.

Me alegra mucho que te haya servido mi sugerencia y espero hayas podido solucionar tu problema ;)