Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Projeto] Ao solicitar alguma ação pelo Postman todas retornam Codigo 500

Ola! Depois que implementei o que foi passado em aula, para validar o token, as minhas açoes pelo postman colocando cabeçalho devolvem a Exception configurada, mas retirando o metodo que foi feito para validar o token ela funciona sem problemas. Coloquei exception.printStackTrace() para analisar qual seria o problema da Exception e o resultado foi o seguinte:

com.auth0.jwt.exceptions.JWTDecodeException: The input is not a valid base 64 encoded string. at com.auth0.jwt.JWTDecoder.(JWTDecoder.java:46) at com.auth0.jwt.JWTVerifier.verify(JWTVerifier.java:444) at br.com.minhas.aulas.spring.infra.security.TokenService.getSubject(TokenService.java:43) at br.com.minhas.aulas.spring.infra.security.SecurityFilter.doFilterInternal(SecurityFilter.java:24) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)

4 respostas

Oi Carlos!

Posta aqui os códigos das suas classes TokenService, SecurityFilter e AutenticacaoController. Se possível também um print da requisição no postman


@Service
public class TokenService {

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


    public String gerarToken(Usuario usuario){
        try {
            var algoritmo = Algorithm.HMAC256(secret);
            return JWT.create()
                    .withIssuer("API Voll.med")
                    .withSubject(usuario.getLogin())
                    .withExpiresAt(dataExpiracao())
                    .sign(algoritmo);
        } catch (JWTCreationException exception){
            throw new RuntimeException("erro ao gerar token jwt", exception);
        }
    }

    public String getSubject(String tokenJWT){
        try {
            var algoritmo = Algorithm.HMAC256(secret);
            return JWT.require(algoritmo)
                    .withIssuer("API Voll.med")
                    .build()
                    .verify(tokenJWT)
                    .getSubject();
        } catch (JWTVerificationException exception){
            exception.printStackTrace();

            throw new RuntimeException("Token JWT inválido ou expirado!");
        }
    }

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

# 1.
@Component 
public class SecurityFilter extends OncePerRequestFilter {

   @Autowired
   private TokenService tokenService;

    @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);
    }

    private String recuperarToken(HttpServletRequest request) {
        var authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader == null){
            throw new RuntimeException("Token JWT não enviado no cabeçalho Authorization!");
        }

        return authorizationHeader.replace("Bearer", "");
    }

}

@RestController
@RequestMapping("/login")
public class AutenticacaoController {

    @Autowired
    private AuthenticationManager manager;

    @Autowired
    private TokenService tokenService;


    @PostMapping
    public ResponseEntity efetuarLogin(@RequestBody @Valid DadosAutenticacao dados){
        var autenticationtoken = new UsernamePasswordAuthenticationToken(dados.login(), dados.senha());
        var authentication = manager.authenticate(autenticationtoken);

        var tokenJWT = tokenService.gerarToken((Usuario) authentication.getPrincipal());
        return ResponseEntity.ok(new DadosTokenJWT(tokenJWT));
    }

}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Certinho. Acho que o problema pode estar nessa linha da classe SecurityFilter:

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

No header costuma vir um espaço em branco após a palavra Bearer, então o código deveria estar assim:

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

Verifica isso e posta aqui o token completo que está sendo enviado no postman, pois no print ele saiu cortado

Deu certo, obrigado!

No caso antes quando eu tentava fazer o login ele pedia para enviar um cabeçalho impossibilitanto de gerar o token, sendo assim precisei tirar todo o codigo de verificação do token para poder gerar o novo token e aumentar o tempo de verificação para .plusMonths(3).

Insira aqui a descrição dessa imagem para ajudar na acessibilidade