“`html
Introdução
A autenticação é um dos aspectos mais críticos no desenvolvimento de aplicações web. Com o aumento da preocupação com a segurança e a privacidade dos dados, técnicas modernas como o JSON Web Token (JWT) se tornaram populares. JWT oferece um método robusto e eficiente para autenticar usuários e permitir o acesso a recursos protegidos em aplicações. Neste artigo, vamos explorar como implementar um sistema de autenticação utilizando JWT em uma aplicação Node.js, abordando desde a configuração do projeto até a implementação de rotas seguras.
Contexto ou Teoria
O JSON Web Token (JWT) é um padrão aberto (RFC 7519) que define um formato compacto e auto-contido para a troca segura de informações entre partes. Os tokens JWT são compostos por três partes principais: o cabeçalho, o payload e a assinatura. O cabeçalho contém informações sobre como o token é assinado, o payload contém as informações do usuário e a assinatura garante que o token não foi alterado. A utilização de JWT permite que o servidor não precise armazenar o estado da sessão do usuário, tornando-o ideal para aplicações escaláveis.
Para implementar a autenticação com JWT em uma aplicação Node.js, geralmente utilizamos bibliotecas como jsonwebtoken para gerar e verificar os tokens, e express como framework web. O fluxo básico de autenticação com JWT envolve o seguinte:
- O usuário faz login com suas credenciais (usuário e senha).
- O servidor valida as credenciais e gera um token JWT.
- O token é enviado para o cliente e armazenado (geralmente em localStorage ou cookies).
- Para acessar rotas protegidas, o cliente deve enviar o token junto com a requisição.
- O servidor verifica o token e, se for válido, permite o acesso ao recurso solicitado.
Demonstrações Práticas
Agora, vamos ao passo a passo de como configurar um sistema de autenticação com JWT em uma aplicação Node.js.
1. Configuração do Projeto
Comece criando uma nova pasta para o seu projeto e inicializando 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 jsonwebtoken bcryptjs body-parser dotenv
2. Estrutura do Projeto
Crie a seguinte estrutura de pastas e arquivos:
mkdir config controllers middleware models routes
touch server.js .env
3. Configuração do Servidor
Abra o arquivo server.js e adicione o seguinte código para configurar o Express e o middleware:
const express = require('express');
const bodyParser = require('body-parser');
const dotenv = require('dotenv');
dotenv.config();
const app = express();
const PORT = process.env.PORT || 3000;
app.use(bodyParser.json());
// Roteamento básico
app.get('/', (req, res) => {
res.send('API de Autenticação com JWT');
});
app.listen(PORT, () => {
console.log(`Servidor rodando na porta ${PORT}`);
});
4. Configuração do Modelo de Usuário
Vamos criar um modelo de usuário simples. Crie um arquivo chamado User.js na pasta models e adicione o seguinte código:
// models/User.js
const users = []; // Simulando um banco de dados com um array
class User {
constructor(username, password) {
this.username = username;
this.password = password; // Senha em texto puro (não recomendado em produção)
}
}
function findUser(username) {
return users.find(user => user.username === username);
}
function addUser(username, password) {
const user = new User(username, password);
users.push(user);
}
module.exports = { findUser, addUser };
5. Implementação da Rota de Registro
Agora, vamos criar a rota de registro de usuários. Crie um arquivo chamado auth.js na pasta routes e adicione o seguinte código:
// routes/auth.js
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const { findUser, addUser } = require('../models/User');
const router = express.Router();
const SECRET = process.env.JWT_SECRET || 'mysecret'; // Chave secreta para assinatura do JWT
// Rota de registro
router.post('/register', async (req, res) => {
const { username, password } = req.body;
// Verifica se o usuário já existe
if (findUser(username)) {
return res.status(400).json({ message: 'Usuário já existe.' });
}
// Criptografa a senha
const hashedPassword = await bcrypt.hash(password, 10);
addUser(username, hashedPassword);
res.status(201).json({ message: 'Usuário registrado com sucesso.' });
});
module.exports = router;
6. Implementação da Rota de Login
Adicione a rota de login no mesmo arquivo auth.js:
<
Deixe um comentário