Introdução
A autenticação é uma parte fundamental de qualquer aplicação web moderna, garantindo que apenas usuários autorizados possam acessar recursos restritos. O uso de tokens JWT (JSON Web Tokens) tem se tornado uma prática comum em aplicações que necessitam de autenticação e autorização, especialmente em arquiteturas RESTful. Neste artigo, exploraremos como implementar um sistema de autenticação utilizando JWT em uma aplicação Node.js, abordando desde a configuração inicial até a proteção de rotas.
Contexto ou Teoria
JSON Web Tokens (JWT) são um padrão aberto (RFC 7519) que define um método compacto e independente para transmitir informações entre partes como um objeto JSON. Esses tokens são usados para autenticar usuários e permitem que informações sejam transmitidas de forma segura, pois são assinados digitalmente. A estrutura básica de um JWT é composta por três partes: header (cabeçalho), payload (carga útil) e signature (assinatura).
O cabeçalho geralmente indica o tipo do token e o algoritmo de assinatura. A carga útil contém as informações do usuário, como ID e permissões. A assinatura é gerada a partir do cabeçalho e do payload, garantindo que o token não tenha sido alterado.
Uma das principais vantagens do uso de JWT é que ele permite a autenticação sem a necessidade de manter sessões no servidor, tornando as aplicações mais escaláveis. Além disso, os tokens podem ser utilizados em diferentes domínios, facilitando a integração entre serviços.
Demonstrações Práticas
Para implementar a autenticação com JWT em uma aplicação Node.js, vamos usar o framework Express, o pacote jsonwebtoken para gerenciar os tokens e o mongoose para interagir com um banco de dados MongoDB. Siga os passos abaixo para criar uma aplicação básica com autenticação:
1. Configurando o Ambiente
Primeiro, crie um novo diretório para seu projeto e inicialize um novo projeto Node.js.
mkdir jwt-auth-example
cd jwt-auth-example
npm init -y
Em seguida, instale as dependências necessárias:
npm install express mongoose jsonwebtoken bcryptjs dotenv
2. Criando a Estrutura do Projeto
Crie os seguintes arquivos e pastas:
mkdir models routes
touch server.js .env
3. Configurando o Banco de Dados
No arquivo .env, adicione a string de conexão do seu banco de dados MongoDB:
MONGO_URI=mongodb://localhost:27017/jwt-auth-example
JWT_SECRET=seu_secreto_aqui
No arquivo models/User.js, crie o modelo de usuário:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: {
type: String,
required: true,
unique: true,
},
password: {
type: String,
required: true,
},
});
const User = mongoose.model('User', userSchema);
module.exports = User;
4. Configurando as Rotas de Autenticação
No arquivo routes/auth.js, crie as rotas para registro e login:
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const User = require('../models/User');
const router = express.Router();
// Registro de usuário
router.post('/register', async (req, res) => {
const { username, password } = req.body;
try {
const hashedPassword = await bcrypt.hash(password, 10);
const user = new User({ username, password: hashedPassword });
await user.save();
res.status(201).json({ message: 'Usuário criado com sucesso' });
} catch (error) {
res.status(400).json({ error: 'Erro ao criar usuário' });
}
});
// Login de usuário
router.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = await User.findOne({ username });
if (!user) {
return res.status(400).json({ error: 'Usuário não encontrado' });
}
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(400).json({ error: 'Senha incorreta' });
}
const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, {
expiresIn: '1h',
});
res.json({ token });
});
module.exports = router;
5. Integrando Tudo no Servidor
Agora, vamos integrar tudo no arquivo server.js:
const express = require('express');
const mongoose = require('mongoose');
const authRoutes = require('./routes/auth');
require('dotenv').config();
const app = express();
app.use(express.json());
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('Conectado ao MongoDB'))
.catch(err => console.log(err));
app.use('/api/auth', authRoutes);
const PORT = process.env.PORT || 300
Deixe um comentário