Guia de Implementação: Sistema de Login Real

Aprenda a configurar, testar e rodar um ambiente completo de autenticação com Node.js, JWT e Front-end.

1 Preparação do Ambiente no Linux

Abra o terminal e crie o diretório do projeto. Inicialize o gerenciador de pacotes do Node.js:

# Criar pasta e acessar
mkdir sistema-login
cd sistema-login

# Inicializar o projeto Node.js
npm init -y

Instale os pacotes necessários para segurança, servidor web e variáveis de ambiente:

npm install express bcryptjs jsonwebtoken cors dotenv

2 Configuração de Variáveis (.env)

Para criar o arquivo oculto de ambiente no Linux usando o terminal:

nano .env

Cole as seguintes configurações dentro do arquivo e salve (Ctrl + O, Enter, depois Ctrl + X):

PORT=3000
JWT_SECRET=minha_chave_secreta_super_segura_12345
FRONTEND_URL=*

3 Código do Servidor (server.js)

Crie o arquivo principal do servidor:

touch server.js

Adicione o seguinte código para gerenciar as rotas de autenticação e proteção de dados:

require('dotenv').config();
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const cors = require('cors');

const app = express();
app.use(cors());
app.use(express.json());

const CHAVE_SECRETA = process.env.JWT_SECRET;
const senhaHashExemplo = bcrypt.hashSync("123456", 10);

const usuarioNoBanco = {
  id: 1,
  email: "usuario@email.com",
  senhaHash: senhaHashExemplo 
};

// Rota de Autenticação
app.post('/api/login', async (req, res) => {
  const { email, senha } = req.body;

  if (email !== usuarioNoBanco.email) {
    return res.status(401).json({ mensagem: "Credenciais inválidas!" });
  }

  const senhaValida = await bcrypt.compare(senha, usuarioNoBanco.senhaHash);
  if (!senhaValida) {
    return res.status(401).json({ mensagem: "Credenciais inválidas!" });
  }

  const token = jwt.sign({ id: usuarioNoBanco.id, email: usuarioNoBanco.email }, CHAVE_SECRETA, {
    expiresIn: '1h'
  });

  return res.json({ token });
});

// Middleware de Segurança
function autenticarToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

  if (!token) return res.status(401).json({ mensagem: "Acesso negado!" });

  jwt.verify(token, CHAVE_SECRETA, (err, user) => {
    if (err) return res.status(403).json({ mensagem: "Sessão inválida ou expirada." });
    req.user = user;
    next();
  });
}

// Rota Protegida
app.get('/api/dashboard', autenticarToken, (req, res) => {
  res.json({
    mensagem: "Acesso concedido aos dados restritos do servidor!",
    usuario: req.user.email
  });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`🚀 Servidor ativo em http://localhost:${PORT}`));

4 Execução do Servidor

Você pode rodar o servidor em modo de desenvolvimento de duas formas:

💡 Dica para Produção no Linux

Para manter o servidor rodando em segundo plano mesmo após fechar o terminal, utilize o gerenciador de processos PM2:

sudo npm install -g pm2 && pm2 start server.js