ASP.NET Core 3.1 + JWT + Refresh Tokens: exemplo de implementação

Renato Groffe
4 min readDec 30, 2019

--

Prática bastante difundida em projetos construídos nas mais variadas plataformas de desenvolvimento, o uso de JWT (JSON Web Tokens) constitui um meio bastante eficaz de proteção no acesso a recursos disponibilizados por APIs REST.

No caso específico do ASP.NET Core e .NET Core, aqueles que acompanham meu blog sabem que venho abordando a utilização de JWT desde a versão 2.0. O post a seguir agrupa os diversos conteúdos gratuitos (artigos, vídeos, projetos de exemplo) que já produzi sobre a configuração e uso de tokens no acesso a APIs REST:

ASP.NET Core + JWT: Guia de Referência

Recentemente publiquei um post com exemplos envolvendo a implementação/configuração de JWT em uma API REST, bem como o consumo de tal API empregando tokens:

.NET Core 3.0 + JWT: exemplos de implementação e consumo

Neste novo post dou continuidade a esse esforço, trazendo desta vez um exemplo de implementação de Refresh Tokens juntamente com JWT em uma API REST baseada no ASP.NET Core 3.1. A aplicação em questão já está disponível no GitHub:

ASP.NET Core 3.1 + JWT (JSON Web Token) + Identity Core + Entity Framework Core InMemory + Redis + Refresh Tokens

Maiores detalhes sobre este tipo de implementação com Refresh Tokens podem ser encontrados no artigo a seguir, em que apresentei um exemplo baseado no ASP.NET Core 2.0:

ASP.NET Core 2.0 + JWT: implementando Refresh Tokens

E por que implementaríamos Refresh Tokens?

O fato de um token possuir um tempo de validade pré-determinado pode ser uma limitação em algumas situações. Expirado tal token um novo deverá ser gerado, a fim de permitir que se continue a interação com os recursos providos por uma API.

Soluções para contornar este comportamento existem e envolvem o uso de Refresh Tokens:

  • Um valor adicional (um segundo token) será gerado, a fim de permitir a solicitação posterior de um novo token de acesso atualizado;
  • Este procedimento dispensa a necessidade de se repetir todo o processo de autenticação que aconteceu durante a obtenção do token inicial, contribuindo assim para uma maior performance.

O uso do Redis no exemplo mencionado neste post permite controlar a validade do Refresh Token de maneira descomplicada, com o mesmo sendo descartado tão logo ocorra sua expiração.

Para entender melhor o fluxo de funcionamento desta implementação enviaremos inicialmente uma requisição à API responsável pela autenticação e fornecimento de um novo token. Utilizar para isto o seguinte conteúdo JSON no corpo da requisição:

O envio de uma requisição HTTP POST com este conteúdo trará como resultado:

O contéudo de accessToken é justamente o token baseado em JWT empregado no header de solicitações HTTP direcionadas à API de Produtos. Ao incluir um novo produto empregando este token e com os seguintes dados no corpo da requisição:

Teremos como resultado:

Decorrido pouco mais de 1 minuto (tempo que o token já estará expirado) uma tentativa de consulta aos produtos cadastrados resultará em um erro de código 401 (Unauthorized):

Podemos então empregar o Refresh Token retornado no início dos testes, a fim de obter um novo token baseado em JWT e evitar a execução de todo o processo de autenticação do zero:

Como resultado de uma requisição com este conteúdo JSON no corpo temos novos valores para accessToken e refreshToken:

Uma nova consulta aos produtos utilizando este novo accessToken resultará em sucesso:

Vale lembrar que este último Refresh Token (assim como os demais que venham a ser gerados) ficará armazenado no Redis em caráter temporário:

E concluo este post com um convite…

Que tal aprender mais sobre Azure Functions e desenvolvimento de soluções Serverless, em um workshop que acontecerá durante um sábado (dia 18/01/2020) em São Paulo Capital e implementando um case na prática? Acesse então o link a seguir para efetuar sua inscrição com um desconto especial de 25%: http://bit.ly/anp-serverless-blog-groffe

E caso você precise conhecer mais sobre o Microsoft Azure como um todo, não deixe de aproveitar o preço promocional de lançamento da primeira turma online do treinamento Azure na Prática que acontecerá dia 15/02/2020 (também um sábado). Aproveite para conhecer mais sobre dezenas de serviços e possibilidades oferecidas pelo Azure e, o melhor, no conforto de sua casa ou ambiente de trabalho! Acesse o link a seguir para informações e efetuar sua inscrição: http://bit.ly/anp-online-blog-groffe

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker

Responses (1)