Skip to content

2. Autenticação com JWT

Filipe Tristão edited this page Nov 3, 2018 · 1 revision

Autenticação JWT

Autenticação JWT (JSON Web Token) é uma forma de autenticação de padrão aberto que pode ser encontrado aqui. Na nossa api, teremos um ponto de entrada onde iremos gerar um token para nosso usuário.

Uma vez que esse token é gerado, ele deverá ser enviado em todas as chamadas da nossa aplicação, e internamente no nosso sistema, quando o token estiver presente não precisamos mais consultar o nosso banco de dados para validar e nem obter informações sobre o usuário que está autenticado! Dessa forma, conseguimos deixar nossa api completamente stateless (ou seja, cada um dos pontos de entrada se torna independente. Ao fazermos uma requisição ela vai ter um ciclo de vida com início meio e fim, sem manter dados de sessão e nem nada do tipo).

Mas como validar as informações do usuário e verificar se ele está logado sem consultar nenhuma base? Isso é possível porque o dentro do próprio token que iremos enviar, há as informações necessárias para validação e os dados de nosso usuário. Isso será melhor explicado a seguir.

Estrutura de um token JWT

Um token JWT é composto pelo header (cabeçalho), payload ou claims (corpo) e signature (assinatura).

Estrutura do Token

Header Tipicamente consiste em um objeto JSON codificado em base64Url, com duas propriedades, o tipo do token, que será sempre JWT e qual a hash que está sendo usada, que pode ser HMAC SHA256 or RSA. Então um header descodificado de um token se parecerá muito com isso:

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload ou Claims

Trata-se da representação da entidade que está autenticada (tipicamente o usuário). Existem três tipos de claims: registrados, públicos e privados.

Os claims registrados, são claims definidos dentro do padrão JWT, que não são obrigatórios no seu token, mas são recomendados por questões de padronização. Alguns desses claims são iss (issuer ou origem do token), exp (expiration time, é a timestamp de quando o token expira), sub (subject, trata-se da entidade que o token pertence, geralmente o id do usuário) entre outros

Os claims públicos são informações customizadas que você deseja colocar em seu token que devem ou ser registradas no IANA JSON Web Token Registry ou devem ser resistentes a colisão (devem ser únicos) contendo algum tipo de namespace. Dificilmente você irá utilizar esses.

Os claims privados, assim como os públicos, serão os claims que conterão as informações personalizadas que você deseja enviar, porém sem a necessidade de serem resistentes a colisão.

Assim como o header, o payload trata-se de um objeto JSON codificado em Base64Url. Abaixo um exemplo de payload:

{
  "sub": "1234567890", //claim registrado
  "eloverde_sistemas_id": "1", //claim público, repare no namespace que antecede a propriedade
  "eloverde_sistemas_name": "John Doe", //claim público, repare no namespace que antecede a propriedade
  "admin": true //claim privado, repare que é uma propriedade do objeto não registrada e que não contem namespace
}

Importante: Uma vez que o token pode ser facilmente decodificado, você não deve guardar nenhuma informação confidencial, como senha.

Signature

É assinatura do seu token. Ele é formado a partir da concatenação do header do seu token e do payload. O verificador será um secret, uma chave secreta que apenas você terá acesso. Então utilizando o algoritmo de encriptação HMAC SHA256, a geração de um token JWT se daria da seguinte forma:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

Se você quiser testar um token JWT e ver como ele fica decodificado, pode utilizar esse link que tem uma ferramenta muito bacana pra isso.

Exemplo:

Gerador