Seu carrinho está vazio no momento!

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!