Invalidar/Bloquear token (JWT) web service RESTful

Tenho um web service RESTful que é gera um token jwt para os clientes que são autorizados a consumir seus recursos, mas me deparei com um problema.

Este token gerado tem um período de validade de 1 hora, passado esse período o token expira e é preciso logar novamente no sistema, esse login é feito através de usuário e senha.

O problema é se o usuário fizer o logout, como posso invalidar esse token ? Esse token ainda continua ativo até finalizar seu período de 1 hora. Este token não é armazenado na aplicação, é gerado e distribuído para o cliente.

Uma solução que pensei é armazenar o token no servidor e se o usuário fizer o logout ou tentar novo login, invalidar o token e gerar um novo, mas sendo uma arquitetura REST que tem como característica ser Stateless é correto fazer isso ?

Bem pensado! Utilizo a biblioteca JJWT pra manipulação de token e de fato não encontrei uma função para invalidar ou destruir o token, porém, vi que eu consigo manipular as informações do token depois que faço um decode dele. Minha sugestão é de settar a data de expiração para a data atual. Não recomendo guardar estado no servidor, acho que fere o princípio do JWT e principalmente do Restful.

No meu caso, quando eu decodifico o token, consigo dar um setExpiration(new Date()). Veja o exemplo:

// decodifico o token pra ter acesso às claims dele
Jws<Claims> claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token);
// aqui eu recupero o payload e modifico a data de expiração para a data atual
claims.getBody().setExpiration(new Date());

Testei aqui e funfou legal, só não sei se essa a melhor prática que matar o JWT…rs

1 curtida

Raphael obrigado pela resposta, gostei da sua sugestão. Também não sei a melhor forma, mas até o momento a sua me parece ideal. Abraços

Olá!

Estou com o mesmo problema, mas creio que essa solução do @raphaeloneves não funcionará para mim.
Em minha API tem um endpoint para renovar o token JWT antes que ele expire, para que o usuário não precise fazer login novamente, e, por questões de segurança, quando renovo o token eu gero um novo token. Mas para que isso funcione preciso invalidar o token original.
Minha dúvida é: se o token original for copiado antes de ser invalidado, a cópia continuará válida até o tempo original do token expirar?

Abç!

acho q vcs precisam implementar uma blacklist de tokens.

invalidou? coloca nessa lista.

Mas não estaria ferindo os princípios do REST e JWT descritos anteriormente?
Creio que, se tratando de segurança, seria melhor ferir esses princípios.

como fere os principios?

é um token. é um recurso. se o usuario desconectou ele deixa de ser valido.

Entendi.
Estava olhando o token como uma maneira de manter sessão, não como um recurso…

Obrigado!

o token esta em outra camada, uma vez que o HTTP é stateless vc precisa de algo extra entre o seu modelo de dados e o universo la fora…

Desculpe minha ignorância, mas eu sou “noob” ainda.

Você está explicando que esse “algo extra” é o token ou que além do token preciso de mais alguma coisa?

no caso é o seu token sim.

Entendi…
Obrigado!