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

[Bug] O token não está sendo recuperado

Olá estou com um problema no metódo doFilterInternal, ele não está recuperando o token vou deixar o código aqui. Se alguém souber o que está acontecendo pode me dar uma ajuda aqui.

Classe Token Service:

@Service
public class TokenService {
    @Value("&{api.security.token.secret}")
    private String secret;

    public String gerarToken(Usuario usuario) {
        System.out.println(secret);
        try {
            var algorithm = Algorithm.HMAC256(secret);
            return JWT.create()
                    .withIssuer("API_VOLL.MED")
                    .withSubject(usuario.getLogin())
                    .withExpiresAt(dataExpiracao())
                    .sign(algorithm);
        } catch (JWTCreationException exception) {
            throw new RuntimeException("Erro ao gerar Token", 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) {
            throw new RuntimeException("Token JWT inválido ou expirado!");
        }
    }

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

Classe SecurityFilter:

@Component
public class SecurityFilter extends OncePerRequestFilter {
    @Autowired
    private TokenService tokenService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        var token = recuperarToken(request);

        System.out.println("Token recuperado: " + token);

        var subject = tokenService.getSubject(token);

        System.out.println("Token subject: " + 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!");
        }
        return authorizationHeader.replace("Bearer", "");
    }
}

Vou mostrar agora o erro que está acontecendo:

O que mostra no Insominia:

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

O que mostra no Inteliji :

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

Se alguém souber o que está acontecendo, da alguma dica de como resolver.

6 respostas

Oi Bruno!

Detectei alguns errinhos no seu código:

1:

// Deveria ser $ e não &
@Value("&{api.security.token.secret}")

2:

.withIssuer("API_VOLL.MED")

No outro método o issuer está diferente: .withIssuer("API Voll.med")

3:

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

Está faltando o espaço em branco após a palavra Bearer

Professor fiz a correção do código e ainda permanece o erro.

Codigo corrigido:

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

    public String gerarToken(Usuario usuario) {
        System.out.println(secret);
        try {
            var algorithm = Algorithm.HMAC256(secret);
            return JWT.create()
                    .withIssuer("API_VOLL.MED")
                    .withSubject(usuario.getLogin())
                    .withExpiresAt(dataExpiracao())
                    .sign(algorithm);
        } catch (JWTCreationException exception) {
            throw new RuntimeException("Erro ao gerar Token", 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) {
            throw new RuntimeException("Token JWT inválido ou expirado!");
        }
    }

    private Instant dataExpiracao() {
        return LocalDateTime.now().plusHours(2).toInstant(ZoneOffset.of("-03:00"));
    }
}
@Component
public class SecurityFilter extends OncePerRequestFilter {
    @Autowired
    private TokenService tokenService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        var token = recuperarToken(request);

        System.out.println("Token recuperado: " + token);

        var subject = tokenService.getSubject(token);

        System.out.println("Token subject: " + 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!");
        }
        return authorizationHeader.replace("Bearer", " ");
    }
}

Quando disparo a requisição da o erro 500:

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

Acho que o erro está no método getSubject, pois quando comento ele a requisição é disparada normalmente:

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

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

Oi Bruno!

Na verdade o espaço em branco é para deixar o código dessa linha assim:

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

Boa noite, Professor o erro ainda persiste não estou sabendo oq está acontecendo.

O código corrigido:

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

O erro :

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

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

solução!

Oi Bruno!

No Insmonia (segundo print) você não colou o token jwt no campo TOKEN. Está iundo vazio

Vdd professor, esse estava sendo o problema