Json Web Token no Play Framework(Java)
Trabalhando em um projeto da universidade fiquei responsável por desenvolver a autenticação de usuários por token em uma REST API. Escolhi utilizar o Json Web Token para gerar os tokens quando o usuário se conecta ou se registra no sistema. Esses tokens devem ser passados em todas as requisições feitas pelo usuário ao sistema e devem ter validade de 24h.
Instalando o Java JWT
Utilizei a biblioteca Java JWT para criar e verificar os JWTs. Para instalar no Play Framework é bem simples, basta adicionar a biblioteca como dependência no build.sbt:
Gerando o token com o Java JWT
Utilizei métodos estáticos da classe Jwts do pacote io.jsonbwetoken para configurar e gerar o token.
Comecei a configuração determinando o subject, que é a informação que será codificada, passando o email do usuário em setSubject(email). Determinei a data de validade passando um objeto do tipo Date em setExpiration(date) e em signWith(algoritmo, key) passei qual algoritmo deve ser usado, nesse caso utilizei HS256(você pode ver a lista de algoritmos que a biblioteca suporta aqui), e a chave de assinatura do app( que foi gerado por MacProvider.generateKey()). Para gerar a String com o valor do token usei o metodo .compact() que gera algo parecido com isso:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4
gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Recuperando a informação que foi codificada
Para recuperar a informação que foi codificada também utilizei os métodos estáticos da classe Jwts.
|
|
Em setSigningKey(key) passei a mesma key que utilizei para gerar o token e em parseClaimsJws(token) passei a String com o token. O método getBody() vai retornar um objeto como todos os dados token e utilizei setSubject() para receber a informação que foi codificada, nesse caso o email do usuário.
Se tentar recuperar a informação após a data de validade do token será retornado uma Exception informando que a o token expirou. Certifique-se que está tratando isto.
Utilizando Cookies para salvar o token gerado no navegador do usuário.
Utilizei Cookies para salvar o token no navegador. Após o cadastro ou login de um usuário o token é enviado para ser armazenado em um cookie no navegador. Sempre que o usuário enviar uma requisição para o servidor o token armazenado é enviado na requisição. Enviei o token atráves da URL(como /?t=yJhbGciOiJIUzI1NiIsI… ou /:token) e valido a requisição verificando se o token ainda é valido.
Para enviar um token para ser salvo nos cookies do navegador você pode fazer assim:
|
|
Para receber o token de uma requisição enviada pelo usuário, pegando do HEADER da requisição:
|
|
Se você passou por URL, utilize o método de recuperar informação referente ao método que você utilizou para passar o token.
Para remover um token dos cookies:
|
|
Código de exemplo de algumas operações utilizando Token e Cookie:
|
|