Como Implementar um Sistema de Autenticação com JWT em Aplicações Node.js

Como Implementar um Sistema de Autenticação com JWT em Aplicações Node.js

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

Comments

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *