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

Token dando null

Quando vai comparar o token secret com o token que chega na Jws está chegando como null, eu não sei o que pode ser. Aí na classe service do token ele está dando sempre false.

 public boolean isTokenValido(String token) {

        try {
            Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token);
            return true;
        }catch (Exception e) {
            return false;
        }
    }
public String gerarToken(Authentication authentication) {
        Usuario logado = (Usuario) authentication.getPrincipal(); //Esse authentication tem um método chamado getPrincipal para conseguirmos recuperar o usuário que está logado
        Date hoje = new Date();
        Date dataExpiration = new Date(hoje.getTime() + Long.parseLong(expiration)); //Eu estou somando os milisegundo da data hoje com e acrescentando mais os milisegundos da expiration;
        return Jwts.builder()
                .setIssuer("Api do Fórum da Alura") //Quem está fazendo a requisição;
                .setSubject(logado.getId().toString())//quem é o dono desse token
                .setIssuedAt(hoje)
                .setExpiration(dataExpiration)
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();
    }

Na classe AuthenticacaoViaTokenFilter:

  private String recuperarToken(HttpServletRequest request) {
        //Nessa requição passo o nome que eu quero recuperar que é do postman.
        String token = request.getHeader("Authorization");

        if (token == null || token.isEmpty() || !token.startsWith("Bearer ")) {
            return null;
        }
        //Pegar o token a partir do bearer, contamos 7 espaços na palavra bearer;
         return token.substring(7, token.length());
    }

Pra gerar o token:

@PostMapping
    public ResponseEntity<TokenDto> autenticar(@RequestBody @Valid LoginForm form) {
        UsernamePasswordAuthenticationToken dadosLogin = form.converter();

        try{
            Authentication authentication = authManager.authenticate(dadosLogin);
            String token = (tokenService).gerarToken(authentication);
            return ResponseEntity.ok(new TokenDto(token, "Bearer"));//Bearer é um dos mecanismos de autenticação utilizados no protocolo HTTP, tal como o Basic e o Digest.
        } catch (AuthenticationException e) {
            return ResponseEntity.badRequest().build();
        }

    }
3 respostas
solução!

Oioi Samantha, tudo bem?

Por aqui, estou com o código idêntico ao seu e está funcionando o token. Tenta verificar na sua classe TokenService se o atributo secret está exatamente assim:

@Value("${forum.jwt.secret}")
    private String secret;

E se no application.properties o secret está dessa forma:

forum.jwt.secret=rm'!@N=Ke!~p8VTA2ZRK~nMDQX5Uvm!m'D&]{@Vr?G;2?XhbC:Qa#9#eMLN\}x3?JR3.2zr~v)gYF^8\:8>:XfB:Ww75N/emt9Yj[bQMNCWwW\J?N,nvH.<2\.r~w]*e~vgak)X"v8H`MH/7"2E`,^k@n<vE-wD3g9JWPy;CrY*.Kd2_D])=><D?YhBaSua5hW%{2]_FVXzb9`8FH^b[X3jzVER&:jw2<=c38=>L/zBq`}C6tT*cCSVC^c]-L}&/

Se tiver algo diferente, troca pra esses por favor e vê se dá certinho :)

Espero ter ajudado, qualquer coisa estou por aqui! Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Yasmin muito obrigada, tinha colocado jws em vez de jwt, aí não estava aparecendo e dava null. Muito obrigada mesmo!!

Que ótimo, Samantha!! Fico muito feliz em ter ajudado :))