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

Problemas JWT

Boa Noite, Estou desenvolvendo um app android que se comunica com um servidor java via REST e usa JWT para fazer a autenticação e autorização e quando faço uma requisição (no caso a 1º sem o token ) a api do jwt me devolve o token e o adiciono na resposta, até este ponto tudo ok. Na requisição com o token eu sempre recebo a mensagem

io.jsonwebtoken.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.

Pesquisando um pouco vi que sugerem fazer a manipulação de Chave Pública e Privada é julgo um pouco complexo visto que no curso de mean mostra o uso de forma mais simples. Se alguém puder ajudar ficarei grato. Segue abaixo também os métodos responsáveis pela geração e parse do token.

GERAÇÃO

    public String generateToken(String username) {
        Map<String, Object> claims = new HashMap<String, Object>();
        claims.put(CLAIM_KEY_USERNAME, username);
        claims.put(CLAIM_KEY_AUDIENCE, "mobile");
        claims.put(CLAIM_KEY_CREATED, new Date());
        return generateToken(claims);
    }

    String generateToken(Map<String, Object> claims) {
        JwtBuilder buider=Jwts.builder();
        buider=buider.setClaims(claims);
        buider=buider.setExpiration(generateExpirationDate());
        buider=buider.signWith(SignatureAlgorithm.HS512, "secret");
        return buider.compact();
    }

Parse do Token

private Claims getClaimsFromToken(String token) {
        Claims claims;
        try {
            JwtParser parser=Jwts.parser();
            parser=parser.setSigningKey("secret");
            Jws<Claims> jws=parser.parseClaimsJws(token);
            claims=jws.getBody();
        } catch (Exception e) {
            e.printStackTrace();
            claims = null;
        }
        return claims;
    }
3 respostas

Opa, perdão pela demora. Vou dar o chute mais simples, de vez em quando resolve, se é que você ainda não resolveu. Existe uma chance que você não está passando o token para o servidor a partir da segunda requisição, essa é a primeira coisa a ver.

Uma segunda chance é que você não está passando o mesmo token.. pq pelo seu código realmente você está usando a mesma chave para encriptar e desencriptar

Olá Alberto, o token é passado sim, pois inclusive eu testo se o mesmo existe no header antes de passar para o JWT descriptografar e eu uso o plugin RestClient do firefox para testar os WebServices REST e coloco sempre o token.

solução!

Boa Noite, Demorei mas achei 1 solução, quando copiava o token no retorno do firefox restClient tava saindo erro na hora de chegar no servidor. Fiz também 1 modificação também na geração do token pois 1 item do map que crio estava com a key errada e na hora de descriptografar o token o JWT achava que o token tinha erro no payLoad. Segue o método alterado

    public String generateToken(String username) {
        JwtBuilder buider=Jwts.builder();
        buider=buider.setSubject(username);
        buider=buider.setAudience(generateAudience());
        buider=buider.setIssuedAt(new Date());
        buider=buider.setExpiration(generateExpirationDate());    
        buider=buider.signWith(SIGNATURE_ALG, "secret");
        return buider.compact();
    }

Valeu Alberto, você estava certo. pode dar como encerrado o topico