Skip to content

Geração e autenticação de Token no ASP.NET Core 2.0

No ASP.NET Core podemos usar o JWT para geração de token, porém do 1.1 para o 2.0 teve mudanças e meu objetivo é mostrar como você pode oferecer um token.

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.”. Eu copiei esse trecho do site jwt.io. Basicamente significa que é um formato de token representando declarações (Claims) entre duas partes, normalmente uma API e um cliente.

Se você acessar o site vai ver que se fala que seguramente o token pode ser transmitido entre partes em JSON. Mas a verdade é que isso somente acontece por que o token é assinado usando uma chave com o algorítimo HMAC e com isso, tanto o gerador de token como o autenticador do token deve entender dessa chave.

Se esse token for descoberto por alguém, somente com essa chave poderá efetuar alteração e gerar um novo token.

Perceba que mais acima eu falei de um gerador de token e um autenticador de token, isso deve está claro na cabeça do desenvolvedor por que vamos precisar disso.

Mas de forma resumida como isso funciona? Bom, uma API não é um sistema normal onde faço o login e continuo autenticado por causa de cookies, OK?

Quando vou utilizar uma API eu basicamente necessito desses passos:

  • Conseguir um token, normalmente através de um login e senha.
  • Com o token adquirido o sistema cliente deve guardar esse token.
  • Para cada requisição enviar junto o token.

Note que os passos acima servem para que o cliente não fique a todo momento enviando seu logina e senha.

Para demonstrar isso eu estou utilizando um projeto simples, uma Web API .Net 2.0 e o postman.

Gerando o Token

Conforme eu expliquei mais acima, a primeira coisa que precisamos é gerar um token para o cliente que deseja acessar a API, para isso eu vou criar uma controller chamada “TokenController”, o código abaixo é um exemplo.

Nessa controller somente temos uma action que usa o verbo POST. No início é bem simples, se não tiver meu nome e sobrenome eu mando um “não autorizado”.

A coisa fica legal depois. Eu criei um builder para gerar o token (eu vi o código do Tahir Naushad e achei legal dessa forma) e no fim passo esse token para o cliente.

Abaixo eu mostro a parte mais importante do build, quando eu estou gerando o token.

A primeira coisa que faço é listar os claims. Se você ainda não sabe direito o que é, existe um artigo meu que fala sobre isso aqui. Mas vou destacar três claims aqui:

  • Jti (Padrão do JWT): É o identificador do token. O gerador deve fazer com que um mesmo identificador não seja usado para tokens diferentes.
  • Sub (Padrão do JWT): É o assunto do token. Podemos classificar nossos tokens por módulos, esse seria o exemplo da utilizado do sub (subject).
  • NameId: É um identificador do nome, nesse caso estou passando o usuário.

Note que eu estou utilizando um enumerador próprio de uma estrutura de claims do JWT para os dois primeiros. Esses itens vem para ajudar e sua obrigação não é necessária. Mas de alguma forma você deve inserir algum claim que identifique o usuário e assim sua API saiba quem é o usuário atual e por esse motivo estou passando o “NameId”.

Na instrução abaixo eu crio um objeto do tipo “JwtSecurityToken” onde informo alguns atributos:

  • Issuer: Quem está emitindo o token. O autenticador precisará entender isso também.
  • Audience: Para quem é esse token. O autenticador precisará entender isso também.
  • Expires: Quando o token expira.
  • SigningCredential: A chave para geração do token. O Autenticador precisará entender isso também.

Dado esse objeto criado, por fim eu apenas quero saber o hash do token, para que o cliente possa pegar e armazená-lo para ser enviado em todas as requisições.

“POST /api/token”

Autenticador do Token

Legal, temos um gerador de token e metade do trabalho foi feito. Mas e a agora, o que o sistema faz com esse token?

Bom, agora precisamos construir um autenticador de token e confesso para você que muita coisa vai ser igual. Por que isso? Por que tanto o gerador de token quanto o autenticador devem está falando a mesma língua, ou seja, o autenticador quando receber o hash precisa saber se o emissor, audiência e a a chave são iguais ao que ele espera.

Abaixo uma parte do código da classe Startup.cs

Como pode ver, na configuração de serviços eu adiciono um serviço do JWT e lá configuro com as mesmas configurações do gerador de token. A única coisa que eu faço a mais é em caso de autenticação ou falha, peço para ser logado no console.

Outra coisa que se faz necessária também na configuração de middlewares é não esquecer de adicionar a instrução “app.UseAutentication()” para que a autenticação aconteça sempre que uma requisição acontecer.

Agora a coisa está pronta. Mas não se esqueça, para poder utilizar uma API que necessita do token é necessário envia lá através do header.

GET /api/values

Authorization Bearer hash_do_token

Para quem quiser estudar esse código e fazer testes segue a url https://github.com/StephanyBatista/JsonWebTokenTutorial

Galera, por hoje é só e espero ter ajudado. Forte abraço!

Você gostou desse artigo? Gostaria de saber mais sobre ASP.NET Core? Eu desenvolvi um curso na Udemy, preço camarada e com mais de 13h de curso. Acesse https://www.udemy.com/aspnet-core-aprendendo-do-zero-ao-avancado/

Published in.Net Core

Be First to Comment

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *