1
resposta

[Projeto] Ao adicionar o método getSubject, todas as requisições retornam erro 500.

O doFilterInternal recebe o token, mas quando adiciono

var subject = tokenService.getSubject(tokenJWT);

Ele não valida mais nenhum e o Insomnia dá sempre o mesmo erro: { "timestamp": "2023-02-09T20:04:08.349+00:00", "status": 500, "error": "Internal Server Error", "message": "The input is not a valid base 64 encoded string.", "path": "/medicos" }

SecurutyFilter:

@Component //Não se encaixa em outras classes específicas, é um componenete. public class SecurityFilter extends OncePerRequestFilter {

@Autowired
private TokenService tokenService;

//Este método é o filtro, ele acessa o método de recuperar cabeçalho e depois o de validar.
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    var tokenJWT = recuperarToken(request);
    var subject = tokenService.getSubject(tokenJWT);
    System.out.println(subject);


    filterChain.doFilter(request, response); //segue para chamar o próximo filtro, se não existir, interrompe a execução.
}

private String recuperarToken(HttpServletRequest request) { //Este método recupera o token do cabeçalho
    var aurthorizationHeader = request.getHeader("Authorization");
    if (aurthorizationHeader == null) {
        throw new RuntimeException("Token JWT não enviado no cabeçalho Authorization!");
    }
    return aurthorizationHeader.replace("Bearer", "");
}

}

TokenService:

@Service public class TokenService {

@Value("${api.security.token.secret}")//assim o valor de secret vai ser lido na classe propreties, a senha depois dos : no properties é para se ele não encontrar a senha ambiente. Ela só existe em produção.
private String secret;
public String gerarToken (Usuario usuario){ //o método veio do https://github.com/auth0/java-jwt, na parte de create jwt, então ele foi adaptado para o projeto.
            try {
        var algoritmo  = Algorithm.HMAC256(secret);
        return JWT.create()
                .withIssuer("API Voll.med")
                .withSubject(usuario.getLogin())
                .withClaim("id", usuario.getId())
                .withExpiresAt(dataErpiracao())
                .sign(algoritmo);
    } catch (JWTCreationException exception){
        throw new RuntimeException("erro ao gerar token jwt", exception);
    }
}

public String getSubject (String tokenJWT){  //Este método valida ou não o token do cabeçalho //o método veio do https://github.com/auth0/java-jwt, na parte de verify jwt, então ele foi adaptado para o projeto.

    try {
        var algoritmo  = Algorithm.HMAC256(secret);
       return JWT.require(algoritmo)
               .withIssuer("API Voll.med")
               .build()
               .verify(tokenJWT)
               .getSubject();



    } catch (JWTCreationException exception){
        throw new RuntimeException("Token JWT inválido ou expriado");


    }


}


private Instant dataErpiracao() {
    return LocalDateTime.now().plusYears(2).toInstant(ZoneOffset.UTC);
}

}

1 resposta

Olá Iasmine,

O problema está dentro do teu método recuperarToken, na linha do return , depois da string "Bearer" não há un espaço. Tu tens duas opções: A primeira é adicionar un espaço logo después da palavra Bearer ficando assim: "Bearer " e a segunda é chamar o método .trim() para remover os espaços.

Deixo o código abaixo com o exemplo das duas opções:

1-

 return aurthorizationHeader.replace("Bearer ", "");

2-

 return aurthorizationHeader.replace("Bearer", "").trim();

Qualquer coisa me avisas si no te funciona.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software