8
respostas

ERRO AO VALIDAR TOKEN

Olá, nessa parte da conversão está acontecendo um expection e sendo assim retornado 403 mesmo mandando o token que foi gerado na autenticação.

        Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token);

parece um problema quanto ao secret...

token: eyJpc3MiOiJBcGkgTXkgSGVybyBUcmFpbm5pbmciLCJzdWIiOiI1NCIsImlhdCI6MTYwNjUzNzE2NCwiZXhwIjoxNjA2NjIzNTY0fQ secret:rm'!@N=Ke!p8VTA2ZRKnMDQX5Uvm!m'D&]{@Vr?G;2?XhbC:Qa#9#eMLN}x3?JR3.2zrv)gYF^8:8>:XfB:Ww75N/emt9Yj[bQMNCWwW\J?N,nvH.<2.rw]e~vgak)X"v8HMH/7"2E,^k@n<vE-wD3g9JWPy;CrY.Kd2_D])=><D?YhBaSua5hW%{2]_FVXzb98FH^b[X3jzVER&:jw2<=c38=>L/zBq}C6tT*cCSVC^c]-L}&/

erro: io.jsonwebtoken.MalformedJwtException Mensagem da stack: JWT strings must contain exactly 2 period characters. Found: 0

8 respostas

Oi Guilherme,

Qual foi o token gerado na autenticação?

Ah vi na mensagem anterior que o token foi: eyJpc3MiOiJBcGkgTXkgSGVybyBUcmFpbm5pbmciLCJzdWIiOiI1NCIsImlhdCI6MTYwNjUzNzE2NCwiZXhwIjoxNjA2NjIzNTY0fQ

Mas tem algo errado com esse token, pois ele deveria ter 3 partes, separadas pelo caractere ponto. Exemplo:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

esse aqui mesmo da mensagem acima: eyJpc3MiOiJBcGkgTXkgSGVybyBUcmFpbm5pbmciLCJzdWIiOiI1NCIsImlhdCI6MTYwNjUzNzE2NCwiZXhwIjoxNjA2NjIzNTY0fQ

Dá uma conferida se sua classe TokenService está correta:

@Service
public class TokenService {

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

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

    public String gerarToken(Authentication authentication) {
        Usuario logado = (Usuario) authentication.getPrincipal();
        Date hoje = new Date();
        Date dataExpiracao = new Date(hoje.getTime() + Long.parseLong(expiration));

        return Jwts.builder()
                .setIssuer("API do Fórum da Alura")
                .setSubject(logado.getId().toString())
                .setIssuedAt(hoje)
                .setExpiration(dataExpiracao)
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();
    }

    public boolean isTokenValido(String token) {
        try {
            Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public Long getIdUsuario(String token) {
        Claims claims = Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token).getBody();
        return Long.parseLong(claims.getSubject());
    }

}

Se estiver tudo ok com a classe, tenta alterar sua propriedade forum.jwt.secret para outra senha sem caracteres especiais(somente letras e números)

Você pode utilizar esse site para gerar uma senha de 256 caracteres: https://passwordsgenerator.net/

insira seu código aqui

'''Essa é minha classe service o que muda é que estou usando int ao invés de long pq minha entidade usuário possui id int, isso interfere ??

package com.ifsp.MyHeroTraining.Security;

'''import com.ifsp.MyHeroTraining.Models.Usuario; import com.ifsp.MyHeroTraining.repository.UsuarioRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service;

import java.util.Optional; @Service public class AutenticacaoService implements UserDetailsService { @Autowired private UsuarioRepository usuarioRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { Optional usuario = usuarioRepository.findByEmail(username); if(usuario.isPresent()){ return usuario.get(); } throw new UsernameNotFoundException("Dados Inválidos!!"); }

} ''' token gerado novamente pela classe auth: eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJBcGkgTXkgSGVybyBUcmFpbm5pbmciLCJzdWIiOiI1NCIsImlhdCI6MTYwNzA5ODY3NSwiZXhwIjoxNjA3MDk4NzExfQ.PZpc9LotBWEnYzFcO1V8QFYkV0Vor2yCupWYTNnIo0k

Usando uma senha sem caracter para o secret deu o mesmo erro.

Agora esse ultimo token que você enviou está correto: eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJBcGkgTXkgSGVybyBUcmFpbm5pbmciLCJzdWIiOiI1NCIsImlhdCI6MTYwNzA5ODY3NSwiZXhwIjoxNjA3MDk4NzExfQ.PZpc9LotBWEnYzFcO1V8QFYkV0Vor2yCupWYTNnIo0k

Talvez seja algum problema ao enviar o token pelo Postman ou na sua classe AutenticacaoViaTokenFilter.

Olá, ele está funcionando agora com o token parece que era erro no postaman mesmo, porém quando eu add essa linha no código .anyRequest().authenticated() ele não consegue realizar a chamada para as ulr que estão liberadas ele dá erro "err_net" no network