ASP.NET Core - Autenticação JWT com Refresh Token - I


 Neste artigo veremos a autenticação JWT com Refresh Token em uma aplicação ASP .NET Core.

Continuando o artigo anterior vamos testar a nossa implementação para gerar o token JWT e o refresh token e acessar um endpoint protegido.

Testando a implementação para gerar o token JWT e o Refresh Token

1- Tentando acessar o controlador protegido

Vamos iniciar tentando acessar o controlador WeatherForecast que esta protegido usando o endpoint /WeatherForecast

Como vemos obtemos o response 401 Unauthorized pois não temos autorização para acessar este endpoint.

2- Criando um novo usuário

Vamos então criar um usuário usando o endpoint /api/authenticate/register :

Ao clicar em Execute teremos a criação do usuário conforme resposta abaixo:

3- Fazendo o login

Com o usuário criado vamos fazer o login usando o endpoint /api/authenticate/login

Executando o request iremos gerar o token JWT e o refreshToken com a data de expiração como mostrado a seguir:

Examinando o banco de dados no SQL Server Management Studio veremos o refresh token e a data de expiração armazenados na tabela AspNetUsers:

Podemos agora acessar o controlador WeatherForecast que esta protegido. Vamos fazer isso usando o Postman e passar o token JWT gerado.

Definimos o GET no endpoint Weatherforecast e em Authorization no Body do request copiamos o token JWT gerado.

Ao executar teremos o seguinte resultado:

Vemos que agora conseguimos acessar o endpoint protegido usando o token JWT gerado.

Vamos esperar o token expirar e tentar acessar novamente o mesmo endpoint.

Como vemos mesmo usando o token obtemos um 401 Unauthorized pois o token expirou.

Vamos então usar o endpoint /api/authenticate/refresh-token para gerar um novo token usando o refresh token que temos armazenado.

Observe que temos que informar o valor do token JWT que expirou e o valor do refresh token.

Executando iremos obter um novo token de acesso JWT e um novo refresh token.

Podemos usar esse novo token de acesso para acessar o controlador protegido WeatherForecast. Os tokens usados anteriormente agora são inválidos.

Podemos também usar o método revoke para revogar o token de atualização de um usuário específico ou de todos os usuários.

Vamos usar o Postman e revogar o refresh token para o usuário macoratti enviando o request abaixo já usando o novo token de acesso:

Obtemos o resultado esperado : 204 No Content.

Podemos verificar no banco de dados que o valor para o refresh token agora foi definido como null:

Se estivermos usando qualquer aplicativo cliente como o Angular ou React, podemos manter esses tokens de acesso e tokens de atualização dentro do armazenamento local(Local Storage) e podemos lidar com as solicitações usando guardas de rota.

E assim vimos como usar o token de atualização junto com os tokens de acesso JWT para proteger nosso aplicativo de API Web .NET Core 6.0.

Os tokens de atualização são extremamente úteis para garantir mais segurança do aplicativo. Geralmente damos um tempo de expiração pequeno para tokens de acesso e, após a expiração, usamos tokens de atualização para obter novos tokens de acesso.

Portanto, se algum invasor obtiver esse token de acesso, ele não poderá usá-lo por mais tempo. Também fornecemos um método de revogação para revogar o token de atualização para um usuário específico ou para todos os usuários e assim damos mais segurança para a nossa aplicação.

Para saber como usar o token com a interface do Swagger veja o artigo :  ASP.NET Core - Usando o token JWT com o Swagger

Pegue o projeto implementado aqui:  AspnJwt_RefreshToken.zip (sem as referências)

"Amo ao SENHOR, porque ele ouviu a minha voz e a minha súplica.
Porque inclinou a mim os seus ouvidos; portanto, o invocarei enquanto viver."
Salmos 116:1,2

Referências:


José Carlos Macoratti