Autenticação JWT no express com BlockList
Vamos começar instalando o Express e uma biblioteca para fazer a criação e validação do token JWT:
Agora vamos criar o nosso serviço com um endpoint que queremos muito proteger:
O primeiro passo vai ser criar uma rota para o login:
Para testar isso com httpie podem-mo executar o seguinte comando:
Em implementações com tokens JWT o front-end irá armazenar esse token no browser e envia-lo junto a todas as requisições que fizer na sua API.
Para validar essas requisições vamos usar um middleware do express:
Agora é so adicionar esse middleware na nossa rota:
Testando com um token válido:
Ok, mas e se o usuario se deslogar antes das 24h o token continua valido certo? Sim, geralmente apenas descarta-mos o token no front-end! Essa é uma solução bem simples e geralmente amais recomendada, mas se isso não for possivel por alguma regra de negocio também podemos criar uma blocklist que invalide o token.
Par aisso vamos precisar fazer algumas alterações no nosso código e no funcionamento da nossa autenticação atual:
- Agora os tokens vão ter também um id, uma “claim” que sera um identificador unico para aquele token, vamos adicionar isso no login
- Criar um rota de logout, que ira armazenar esse ID, uma boa ideia e salvar no redis com um TTL assim os dados somem depois de um tempo, mas pode salvar em um banco de dados comum, como aqui estou só brincando e escrevendo um post rápido, vou salvar em um Array, jamais faça isso em produção
- Vamos precisar validar esse id contra uma lista de tokens que foram invalidados, o acesso so deve ser liberado se o token não existir nessa lista
O login será bem simples de alterar, vamos adicionar uma “claim” jti
, ou JWT ID, com um valor aleatorio:
A rota de logou será mais ou menos assim:
Só lembrando mais uma vez: Não salve nada em variavel global em um código de verdade, isso e apenas um exercicio, e possivelmente depois eu vou fazer um post usando redis.
E ao verificar o token adicionamos mais uma condição:
Testando a rota de logout:
E agora chamando esse endpoint depois de chamar o logout:
Este é um post super rapidinho para cumprir um desafio de escrever posts por 30 dias, você pode ver outros posts na tag 30daysOfPosts