Autorização e Autenticação em Node.js: Guia Completo
No desenvolvimento web moderno, a segurança dos dados do usuário é a prioridade número um. Neste guia, abordaremos as principais ferramentas e bibliotecas para implementar autenticação (verificação da identidade do usuário) e autorização (verificação de permissões de acesso) em aplicações Node.js. Você aprenderá como configurar a proteção de rotas, hashear senhas e trabalhar com tokens de acesso.
1. Conceitos Básicos
- Autenticação — processo de verificar se o usuário é quem diz ser (geralmente através de login e senha).
- Autorização — determinação de quais recursos e ações estão disponíveis para um usuário autenticado.
- JWT (JSON Web Token) — forma compacta e autossuficiente de transmitir dados como um objeto JSON. Usado para criar tokens de acesso.
- Sessões — método tradicional de armazenar dados do usuário no servidor (geralmente usando
express-session).
2. Bibliotecas Principais para Node.js
2.1. bcrypt — hashing de senhas
Nunca armazene senhas em texto puro. bcrypt é uma biblioteca para hashing seguro com uso de salt.
const bcrypt = require('bcrypt');const saltRounds = 10;
// Hashing de senhaasync function hashPassword(password) { const salt = await bcrypt.genSalt(saltRounds); const hash = await bcrypt.hash(password, salt); return hash;}
// Verificação de senhaasync function checkPassword(password, hash) { const match = await bcrypt.compare(password, hash); return match; // true ou false}2.2. jsonwebtoken — trabalhando com JWT
A biblioteca jsonwebtoken permite criar e verificar tokens JWT. Os tokens geralmente consistem em cabeçalho, payload e assinatura.
const jwt = require('jsonwebtoken');const secretKey = 'sua-chave-secreta';
// Criação de tokenfunction generateToken(userId, role) { const payload = { userId, role }; const token = jwt.sign(payload, secretKey, { expiresIn: '1h' }); return token;}
// Verificação de token (middleware)function verifyToken(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN if (!token) return res.status(401).json({ error: 'Token não fornecido' });
jwt.verify(token, secretKey, (err, decoded) => { if (err) return res.status(403).json({ error: 'Token inválido' }); req.user = decoded; next(); });}2.3. Passport.js — autenticação universal
Passport.js é um middleware para Express que suporta mais de 500 estratégias (local, OAuth, JWT, Google, Facebook, etc.). Exemplo de estratégia local:
const passport = require('passport');const LocalStrategy = require('passport-local').Strategy;const User = require('./models/User');
passport.use(new LocalStrategy( async (username, password, done) => { try { const user = await User.findOne({ username }); if (!user) return done(null, false, { message: 'Usuário não encontrado' }); const isValid = await bcrypt.compare(password, user.password); if (!isValid) return done(null, false, { message: 'Senha incorreta' }); return done(null, user); } catch (err) { return done(err); } }));
// Serialização e desserialização (para sessões)passport.serializeUser((user, done) => done(null, user.id));passport.deserializeUser(async (id, done) => { const user = await User.findById(id); done(null, user);});3. Exemplo Completo: Registro e Login
Vamos juntar tudo em uma aplicação Express simples.
const express = Também na biblioteca
CryptoKit para Swift: guia completo com exemplos
Testes em Kotlin: frameworks e ferramentas para código de qualidade
Geolocalização e mapas em Kotlin: visão geral de bibliotecas e ferramentas
Dokka para Kotlin: guia completo com exemplos práticos