Projetos
Testes

Criando um Projeto Node.js com Arquitetura MVC e Autenticação com JWT

Por que criar mais um projeto com login em Node.js? Para mim, o objetivo não era apenas autenticar usuários, mas sim aprender a organizar um projeto de forma escalável, usando a arquitetura MVC e aplicando testes com Jest. Nesse post, mostro como está sendo minha experiência até agora com esse projeto e o que já está funcionando.

01 de ago. de 2025

7 min de leitura

Criando um Projeto Node.js com Arquitetura MVC e Autenticação com JWT

Estrutura MVC aplicada

Organizei o projeto em módulos por responsabilidade, usando a estrutura MVC (Model, View, Controller). Cada módulo fica isolado e contém seus próprios arquivos de controller, service, model, DTOs e testes.

users/
├── __tests__/
│   ├── controller.test.ts
│   └── service.test.ts
├── __mocks__/
├── user.controller.ts
├── user.dto.ts
├── user.model.ts
├── user.routes.ts
└── user.service.ts
  • Controller: recebe as requisições e direciona para os serviços.
  • Service: contém a regra de negócio.
  • Model: define os modelos do banco de dados.
  • DTO: define os tipos esperados nas requisições.
  • Routes: define as rotas do módulo.

Essa abordagem deixa tudo mais limpo e fácil de dar manutenção, principalmente à medida que o projeto cresce.

Autenticação com JWT: Access e Refresh Token

Implementei um sistema completo de autenticação com Access Token e Refresh Token, utilizando o pacote jsonwebtoken. O Refresh Token é salvo com hash no banco de dados e associado ao IP e User-Agent da requisição.

Fluxo:

  • O usuário realiza login na rota /login.
  • O backend gera dois tokens:
    • Access Token: curto prazo (geralmente 15 minutos)
    • Refresh Token: longo prazo (7 dias), armazenado no banco de forma segura
  • Quando o Access Token expira, o cliente chama a rota /refresh com o Refresh Token.
  • O backend valida o Refresh Token, verifica sua integridade e validade, e emite um novo par de tokens.

Esse sistema permite revogação de sessões específicas e oferece mais segurança comparado ao uso de um único token persistente.

Criação de Usuários

A API permite a criação de usuários por meio da rota /users. Essa rota utiliza DTOs para validar o corpo da requisição e aplicar regras como:

  • Email único
  • Senha criptografada com bcrypt
  • Retorno sem expor a senha do usuário
// Exemplo de criação de usuário (simplificado)
router.post('/users', userController.createUser);

O controller chama o service, que trata a lógica de verificação e criação, usando Sequelize.

Testes com Jest

Implementei testes unitários para os principais fluxos de autenticação usando o Jest. Os testes cobrem:

describe("refreshToken", () => {
  it("Should return erro 'Refresh token inválido ou expirado'", async () => {
    const fakeToken = "A1B2C3";

    (jwt.verify as jest.Mock).mockImplementationOnce(() => {
      throw new Error("Refresh token inválido ou expirado");
    });

    expect(refreshToken(fakeToken)).rejects.toThrow(
      "Refresh token inválido ou expirado"
    );
  });
});

Também testei:

  • Token inválido por falha no bcrypt.compare.
  • Token expirado com base na expires_at.
  • Geração correta de novo token com validade de 7 dias.
  • Atualização do token no banco.

Esse tipo de teste ajuda muito a garantir que o sistema continue funcionando mesmo com alterações futuras.

O que ainda falta implementar?

Atualmente o sistema ainda não permite criar usuários — estou desenvolvendo essa funcionalidade. O foco por enquanto foi construir uma base sólida:

✅ Login com geração de Access e Refresh Token
✅ Rota de criação de usuários com validação
✅ Rota para renovação de token
✅ Armazenamento e validação segura dos Refresh Tokens
✅ Testes unitários com Jest
✅ Separação clara com arquitetura MVC

Próximas etapas

[ ] Middleware para proteger rotas com Access Token
[ ] Logout e revogação de Refresh Token por sessão
[ ] Logs e monitoramento das requisições

Aprendizados até aqui

  • MVC torna o projeto muito mais fácil de manter.
  • Separar lógica por camadas (controller, service, model) ajuda a escrever testes mais limpos.
  • Lidar com JWT exige cuidado extra com segurança, tempo de expiração e armazenamento de Refresh Tokens.
  • Escrever testes desde o início acelera o desenvolvimento, não atrasa.

Conclusão

Esse projeto tem sido um ótimo laboratório para aplicar boas práticas com Node.js. Se você também está estudando arquitetura de projetos ou autenticação com JWT, recomendo começar com algo simples, mas bem estruturado.

Se quiser conferir o código (ou contribuir), o repositório está aqui:
📂 alanls1

Tags

Projetos
Testes

Artigos Relacionados

Imagem sobre o React

Imagem sobre o React

Imagem sobre o React

Blog DevTest

Conteúdo técnico Sobre React, Jest e testes modernos para desenvolvedores de todos os níveis

© 2025

DevTrail. Todos os direitos reservados.

Termos. Privacidade