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

“`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:

<

Comments

Deixe um comentário

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