Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 63 – API JavaScript, Node.js e Express – JWT Fundamentals – JSON Web Tokens

Imagem destacada da aula de API

Introdução (3 min)

Imagine um passe VIP para um festival de música. Esse passe, contendo informações como seu nome e data de validade, permite acesso às áreas restritas. JWT, ou JSON Web Token, funciona de forma semelhante em APIs. É um passe digital seguro que garante acesso a recursos protegidos.

JWT é essencial para APIs modernas, pois oferece uma maneira robusta e eficiente de autenticar e autorizar usuários. Nesta aula, você compreenderá o conceito de JWT, sua implementação prática em Node.js/Express, e como integrá-lo em seus projetos.

No contexto Node.js/Express, JWT se encaixa perfeitamente como mecanismo de autenticação, substituindo ou complementando métodos tradicionais como sessões.

Conceito Fundamental (7 min)

Um JWT é um padrão aberto (RFC 7519) que define uma maneira compacta e independente de transmitir informações com segurança entre partes como um objeto JSON. Essas informações podem ser verificadas e confiáveis, pois são assinadas digitalmente.

A terminologia inclui termos como cabeçalho, carga útil (payload) e assinatura. O cabeçalho descreve o token, o payload contém as informações, e a assinatura garante a integridade do token.

Casos de uso comuns incluem autenticação de usuário em aplicações web e APIs, troca de informações entre sistemas distribuídos, e autorização de acesso a recursos.

JWT se integra facilmente com outras tecnologias, como OAuth 2.0 e OpenID Connect.

Vantagens: Segurança reforçada, stateless (sem necessidade de armazenar informações no servidor), fácil implementação em diversas plataformas.

Desvantagens: Tamanho do token pode impactar performance em conexões lentas, revogação de tokens requer mecanismos adicionais.

Implementação Prática (10 min)

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

const app = express(); const PORT = process.env.PORT || 3000; const SECRET_KEY = 'sua-chave-secreta'; // MUITO IMPORTANTE: Em produção, use uma chave forte e armazene-a seguramente!

// Rota protegida app.get('/protected', authenticateToken, (req, res) => { res.json({ message: 'Rota protegida acessada com sucesso!', user: req.user }); });

// Middleware de autenticação function authenticateToken(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1];

if (token == null) return res.sendStatus(401); // Unauthorized

jwt.verify(token, SECRET_KEY, (err, user) => { console.error(err); // Logging profissional if (err) return res.sendStatus(403); // Forbidden req.user = user; next(); }); }

// Rota de login (exemplo) app.post('/login', (req, res) => { // Validação de usuário (exemplo simplificado) const user = { username: 'usuario', id: 1 };

// Geração do token const accessToken = jwt.sign(user, SECRET_KEY); res.json({ accessToken }); });

app.listen(PORT, () => { console.log(Servidor rodando na porta ${PORT}); });

npm install express jsonwebtoken
node seu-arquivo.js

Este código demonstra um fluxo básico de autenticação com JWT. A rota /protected é protegida pelo middleware authenticateToken. A rota /login gera um token JWT após a “validação” do usuário. O SECRET_KEY é vital para a segurança e deve ser mantido em segredo, idealmente em variáveis de ambiente.

Exercício Hands-On (5 min)

Crie uma nova rota /profile que retorne informações do perfil do usuário, acessível somente com um token JWT válido. Adicione também um campo role (ex: “admin”, “user”) ao payload do token e utilize-o para controlar o acesso a esta nova rota, permitindo apenas usuários com a role “admin”.

Solução:

Modifique o código anterior adicionando a verificação da role no middleware e criando a rota /profile. Utilize req.user.role para acessar a role do usuário.

Testes:

Utilize um client HTTP como Postman ou Insomnia para testar as rotas com e sem um token JWT válido. Observe os códigos de status HTTP retornados (200 OK, 401 Unauthorized, 403 Forbidden).

Troubleshooting:

Erros comuns incluem token inválido, token expirado e chave secreta incorreta. Verifique a implementação e o console de erros para diagnosticar problemas.

Próximos passos:

Explore bibliotecas como jsonwebtoken para funcionalidades adicionais, como refresh tokens e blacklisting. Implemente a persistência de usuários em um banco de dados. Estude sobre diferentes algoritmos de assinatura e boas práticas de segurança para JWT.

🚀 Pronto para a próxima aula?

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

📚 Ver todas as aulas