Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 65 – API JavaScript, Node.js e Express – Refresh Tokens – Renovação segura

Imagem destacada da aula de API

Introdução (3 min)

Imagine um crachá de acesso a um prédio. Ele garante sua entrada por um tempo determinado. Quando expira, você precisa renová-lo para continuar acessando o edifício. Refresh Tokens em APIs funcionam de maneira similar. Eles fornecem uma forma segura de renovar o acesso sem exigir que o usuário refaça o login a cada vez que o token de acesso expira.

Este mecanismo é vital para APIs modernas, pois possibilita uma experiência de usuário fluida e segura, além de ser essencial para integrações com aplicações de terceiros. Nesta aula, você aprenderá a implementar Refresh Tokens com Node.js e Express, seguindo as melhores práticas da indústria.

Dentro do ecossistema Node.js/Express, os Refresh Tokens são geralmente gerenciados com a ajuda de bibliotecas como o jsonwebtoken e armazenados de forma segura, como em um banco de dados.

Conceito Fundamental (7 min)

Um Refresh Token é uma credencial especial, de longa duração, que permite a um cliente obter um novo Access Token (token de acesso) sem precisar fornecer novamente as credenciais de login. O Access Token, que é usado para autorizar as requisições à API, possui uma validade curta por questões de segurança. Quando este expira, o cliente usa o Refresh Token para solicitar um novo Access Token ao servidor de autorização.

Este processo é fundamental em cenários de produção, como em aplicativos mobile que precisam manter a sessão do usuário ativa por períodos prolongados. Ele se integra com outras tecnologias como OAuth 2.0, o padrão da indústria para autorização.

A principal vantagem dos Refresh Tokens é a melhoria da experiência do usuário e segurança. A desvantagem é a complexidade adicional na implementação e gerenciamento, exigindo armazenamento seguro e mecanismos de revogação.

Implementação Prática (10 min)

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express(); app.use(express.json());

const REFRESH_TOKEN_SECRET = 'seu_segredo_refresh_token'; // Armazene em variáveis de ambiente! const ACCESS_TOKEN_SECRET = 'seu_segredo_access_token'; // Armazene em variáveis de ambiente!

// Simulando um banco de dados (NÃO USE EM PRODUÇÃO!) const refreshTokens = [];

app.post('/token', (req, res) => { const refreshToken = req.body.refreshToken;

if (refreshToken == null) return res.sendStatus(401); if (!refreshTokens.includes(refreshToken)) return res.sendStatus(403);

jwt.verify(refreshToken, REFRESH_TOKEN_SECRET, (err, user) => { if (err) return res.sendStatus(403); const accessToken = generateAccessToken({ name: user.name }); res.json({ accessToken: accessToken }); }); });

app.post('/login', (req, res) => { // Autenticação (NÃO IMPLEMENTADA NESTE EXEMPLO - use um middleware adequado) const username = req.body.username; const user = { name: username };

const accessToken = generateAccessToken(user); const refreshToken = jwt.sign(user, REFRESH_TOKEN_SECRET); refreshTokens.push(refreshToken); // Armazene em um banco de dados em produção! res.json({ accessToken: accessToken, refreshToken: refreshToken }); });

function generateAccessToken(user) { return jwt.sign(user, ACCESS_TOKEN_SECRET, { expiresIn: '15s' }); }

app.listen(3000, () => console.log('Servidor rodando na porta 3000'));

npm install express jsonwebtoken
node seu_arquivo.js

Neste exemplo, simulamos o armazenamento dos Refresh Tokens em um array. Em um ambiente de produção, armazene-os em um banco de dados seguro, como PostgreSQL ou MySQL, disponível no HostGator Plano M. A implementação da autenticação, neste exemplo simplificado, deve ser substituída por um middleware robusto em produção. Garanta também o uso de variáveis de ambiente para armazenar os segredos dos tokens.

Exercício Hands-On (5 min)

Modifique o código para implementar a revogação de Refresh Tokens. Crie uma rota /logout que remove o token do array (ou banco de dados em produção). Teste a revogação fazendo login, obtendo um Refresh Token, usando-o para obter um novo Access Token, então, fazendo logout e tentando usar o mesmo Refresh Token novamente. Ele deve falhar com um código 403.

Solução:

Adicione o seguinte código ao arquivo:

app.delete('/logout', (req, res) => {
  const refreshToken = req.body.refreshToken;
  refreshTokens = refreshTokens.filter(token => token !== refreshToken); // Remova do array ou banco de dados
  res.sendStatus(204);
});

Teste com Postman ou curl. Observe o código de status 204 após o logout e o 403 ao tentar reutilizar o Refresh Token.

Próximos passos: Explore bibliotecas de gerenciamento de tokens, como o jsonwebtoken, para features avançadas como rotação de chaves e blacklisting de tokens.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas