Autorização e Autenticação em JavaScript (Node.js)
No desenvolvimento web moderno, a segurança dos dados do usuário é uma prioridade. Neste guia, abordaremos os conceitos-chave de autenticação (verificação de identidade) e autorização (controle de acesso) no ambiente Node.js. Você aprenderá como implementar registro, login com senha, uso de tokens JWT e proteção de rotas.
1. Conceitos Básicos
- Autenticação — processo de confirmar a identidade (ex.: por email+senha).
- Autorização — verificar se o usuário tem permissão para executar uma ação (papel admin/user).
- JWT (JSON Web Token) — forma compacta de transmitir dados como token, frequentemente usado para sessões.
- Hash de senhas — requisito obrigatório de segurança (bcrypt, argon2).
2. Instalação de Dependências
Para trabalhar, precisaremos dos seguintes pacotes npm:
npm install express bcryptjs jsonwebtoken dotenvexpress— framework webbcryptjs— hash de senhasjsonwebtoken— criação e verificação de JWTdotenv— gerenciamento de chaves secretas
3. Registro Simples e Hash de Senha
Criaremos um modelo básico de usuário (para exemplo, usaremos um array em memória; em um projeto real, substitua por um banco de dados):
const bcrypt = require('bcryptjs');const users = []; // simulação de BD
async function registerUser(email, password) { const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(password, salt); users.push({ email, password: hashedPassword }); console.log('Usuário registrado:', email);}
// Exemplo de chamada:registerUser('user@example.com', 'myPassword123');4. Autenticação com JWT
Após o login bem-sucedido, emitimos um token JWT para o cliente. O token contém o ID do usuário e o prazo de validade.
const jwt = require('jsonwebtoken');require('dotenv').config();
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
function loginUser(email, password) { const user = users.find(u => u.email === email); if (!user) return null;
const isValid = bcrypt.compareSync(password, user.password); if (!isValid) return null;
// Criar token const token = jwt.sign( { userId: user.email, role: 'user' }, JWT_SECRET, { expiresIn: '1h' } ); return token;}5. Middleware para Proteção de Rotas
Criaremos um middleware que verifica o JWT no cabeçalho Authorization:
function authMiddleware(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
if (!token) { return res.status(401).json({ message: 'Token não fornecido' }); }
try { const decoded = jwt.verify(token, JWT_SECRET); req.user = decoded; // passa dados do usuário para a requisição next(); } catch (err) { return res.status(403).json({ message: 'Token inválido' }); }}6. Exemplo de Uso no Express
Juntando tudo — criamos rotas para login e perfil protegido:
const express = require('express');const app = express();app.use(express.json());
// Rota de loginapp.post('/api/login', (req, res) => { const { email, password } = req.body; const token = loginUser(email, password); if (!token) { return res.status(401).json({ message: 'Credenciais inválidas' }); } res.json({ token });});
// Rota protegidaapp.get('/api/profile', authMiddleware, (req, res) => { res.json({ message: 'Acesso