/ #aspnetcore #jwt #auth #json web token #refresh token 

Autenticação em APIs ASP.Net Core com JWT - Refresh Token

Quando trabalhamos com autenticação baseada em tokens JWT temos que considerar que ele tem um tempo de expiração que irá invalidá-lo em determinado momento. Em alguns cenários pode ser interessante obter um novo token de acesso sem precisar forçar o usuário a fazer um novo login informando seu usuário e senha. Isso é muito comum quando trabalhamos com aplicativos mobile.

Para esse artigo usei o mesmo exemplo de código de um artigo anterior onde mostro como implementar uma API de Autenticação simples com JWT. Você pode conferir em meu Github.

O que é Refresh Token?

Imagine que o cliente faça login no seu aplicativo informando usuário e senha, sua API devolve um token JWT que seu app deverá armazenar internamente. Sabemos que em todas as requisições seguintes o app deverá enviar o token no header Authorization para a API que irá consumir.

O cliente coloca o app em background e só volta a usá-lo após algumas horas. Muito provavelmente o token de acesso criado anteriormente já expirou e ao tentar fazer qualquer chamada na API o app irá receber um HTTP Status Code 401 — Unauthorized. Você tem duas opções, a) redirecionar o cliente para a tela de login e forçá-lo a fazer um novo acesso, b) pedir para que a API de autenticação forneça um novo token JWT válido de forma transparente para o cliente.

Caso seu app não necessite que o cliente faça um novo login a cada tempo de expiração, como é o caso de aplicativos bancários por exemplo, você pode optar por gerar um novo token de forma transparente para o cliente fazendo uso do que chamamos de Refresh Token.

Para isso, além do token de acesso principal, você deve gerar um token secundário com tempo de expiração maior. Por exemplo, se o access_token expira em 8h, seu refresh_token irá expirar em 16 horas (não precisar ser necessariamente esse tempo, você deve definir um tempo adequado).

O refresh_token dever ser devolvido para seu aplicativo junto com o token JWT principal no momento do login. O app então deverá armazenar o refresh_token internamente, assim como já faz com o access_token.

Conjunto de tokens de acesso

Como implementar?

No projeto de exemplo, você irá encontrar uma classe chamada JwtService que é responsável por gerar um token JWT. O que eu fiz foi implementar a criação do Refresh Token da seguinte forma.