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.