Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 64 – API JavaScript, Node.js e Express – JWT Implementation – Prática completa

Imagem destacada da aula de API

Introdução (3 min)

Imagine um crachá VIP que lhe dá acesso a áreas restritas de um evento. JWT, ou JSON Web Token, é como esse crachá digital para suas APIs. Ele é estratégico para APIs modernas porque permite autenticação e autorização seguras e eficientes, sem precisar armazenar informações sensíveis no servidor.

Nesta aula, vamos desenvolver uma API Node.js/Express que utiliza JWT para proteger rotas, implementando desde a geração do token até sua validação em cada requisição. Veremos como integrar essa poderosa ferramenta no ecossistema Node.js, garantindo a segurança da sua aplicação.

Conceito Fundamental (7 min)

JWT é um padrão aberto (RFC 7519) que define uma maneira compacta e autocontida de transmitir informações com segurança entre partes como um objeto JSON assinado digitalmente. Essas informações podem ser verificadas e confiáveis porque são assinadas digitalmente. O token contém três partes: Header, Payload e Signature.

    • Header: Contém o tipo do token e o algoritmo de hashing usado.
    • Payload: Contém as informações, os claims. Exemplos: ID do usuário, nome, permissões.
    • Signature: Garante a integridade do token, gerada a partir do Header, Payload e uma chave secreta.

Casos de uso comuns incluem autenticação de usuário em aplicações web e mobile, troca de informações entre serviços e autorização de acesso a recursos. JWT se integra com diversas tecnologias, como OAuth 2.0.

A principal vantagem do JWT é a sua eficiência. Como o token contém todas as informações necessárias, não há necessidade de consultas ao banco de dados em cada requisição. A desvantagem é que, uma vez emitido, o token é válido até expirar, mesmo que o usuário revogue o acesso. Existem estratégias para mitigar esse problema, como o uso de listas negras (blacklists).

Implementação Prática (10 min)

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

const app = express(); const SECRET_KEY = 'sua_chave_secreta'; // MUITO IMPORTANTE: Troque por uma chave forte e aleatória! Armazene em variáveis de ambiente.

// Middleware para verificar o JWT const authenticateJWT = (req, res, next) => { const authHeader = req.headers.authorization;

if (authHeader) { const token = authHeader.split(' ')[1]; // Extrai o token do header 'Bearer '

jwt.verify(token, SECRET_KEY, (err, user) => { if (err) { return res.sendStatus(403); // Forbidden }

req.user = user; // Disponibiliza o payload do JWT na requisição next(); }); } else { res.sendStatus(401); // Unauthorized } };

app.post('/login', (req, res) => { // Substitua por sua lógica de autenticação (ex: consulta ao banco de dados) const user = { id: 1, username: 'joao' };

const accessToken = jwt.sign(user, SECRET_KEY, { expiresIn: '1h' }); // Gera o token com expiração de 1 hora

res.json({ accessToken }); });

app.get('/protected', authenticateJWT, (req, res) => { // Rota protegida pelo JWT res.json({ message: Olá, ${req.user.username}! Você acessou a rota protegida. }); });

const PORT = process.env.PORT || 3000 app.listen(PORT, function() { console.log(Servidor rodando em http://localhost:${PORT}); });

npm install express jsonwebtoken
node seu_arquivo.js

Observações:

    • A chave secreta (SECRET_KEY) NUNCA deve ser exposta no código. Utilize variáveis de ambiente.
    • HostGator Plano M suporta variáveis de ambiente através do cPanel.
    • Este código demonstra o fluxo básico. Implemente logging e validação de entrada robustos em produção.

    Exercício Hands-On (5 min)

    Crie uma nova rota protegida /admin que só pode ser acessada por usuários com a propriedade isAdmin: true no payload do JWT. Gere um novo token com essa propriedade para testar.

    Solução:

    // ... (código anterior)

    app.get('/admin', authenticateJWT, (req, res) => { if (req.user.isAdmin) { res.json({ message: 'Área administrativa' }); } else { res.sendStatus(403); // Forbidden } });

    // ... (resto do código)

    // Exemplo de geração de token para admin: const adminToken = jwt.sign({ id: 2, username: 'admin', isAdmin: true }, SECRET_KEY, { expiresIn: '1h' }); console.log('Token de admin:', adminToken);

    Teste acessando a rota /admin com o novo token e com o token anterior. Observe o comportamento.

    Próximos passos: Explore bibliotecas como jsonwebtoken para gerenciar tokens, refresh tokens, blacklists e outras funcionalidades avançadas. Considere a utilização de bibliotecas como Passport.js para simplificar a integração com diferentes estratégias de autenticação.

    🚀 Pronto para a próxima aula?

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

    📚 Ver todas as aulas