Executando verificação de segurança...
13

Desafio Técnico: Desenvolvimento de uma API de Autenticação, Autorização e Gerenciamento de Permissões com Node.js

Recentemente, participei de um desafio técnico para desenvolvedor back-end, onde tive a oportunidade de criar uma API completa com foco em autenticação, autorização e gerenciamento de permissões de usuários. Utilizei tecnologias modernas como Node.js, Fastify, Prisma, JWT, e Zod para entregar uma solução robusta e segura.

Neste artigo, vou compartilhar um pouco da experiência, as tecnologias utilizadas e as principais funcionalidades que implementei.

🎯 Objetivo do Projeto

O desafio tinha como objetivo principal criar uma API RESTful capaz de:

  • Autenticar usuários com CPF e senha, utilizando JWT para autenticação.
  • Gerenciar permissões de acesso com base em roles (ex: Administrador, Vendedor).
  • Implementar um sistema onde apenas administradores podem criar ou remover permissões de outros usuários.
  • Documentar toda a API, facilitando o consumo e teste.

🛠️ Tecnologias Utilizadas

  • Node.js: O motor por trás da API, utilizado para criar um servidor rápido e eficiente.
  • Fastify: Framework escolhido por ser leve e otimizado para APIs de alta performance.
  • Prisma: Um ORM (Object-Relational Mapping) poderoso que facilitou a interação com o banco de dados PostgreSQL.
  • JWT (JSON Web Tokens): Utilizado para gerenciar autenticação e fornecer tokens de acesso para as rotas protegidas.
  • Zod: Biblioteca para validação de dados que garantiu a segurança dos dados de entrada em todas as rotas.

🔑 Funcionalidades Implementadas

1. Autenticação de Usuários

A API permite que os usuários façam login com CPF e senha. Após a autenticação bem-sucedida, um token JWT é gerado e devolvido ao usuário. Esse token é utilizado para acessar rotas protegidas.

Exemplo de Requisição:

POST /api/login
{
  "cpf": "793.431.150-83",
  "password": "senhapadrao"
}

Se a autenticação for bem-sucedida, um token JWT será retornado para ser usado nas demais rotas.

2. Criação e Gerenciamento de Permissões

Somente administradores têm permissão para criar e gerenciar permissões de usuários. As rotas de criação, listagem e remoção de permissões garantem controle refinado sobre o que cada usuário pode acessar na aplicação.

Exemplo de Adição de Permissão:

POST /api/users/permissions
{
  "userId": "cm159sosc0000ppqgr5t4gnlp",
  "permissionId": "cm159sosc0000ppqgr5t4gnlp"
}

3. Controle de Acesso Baseado em Roles

O sistema foi projetado para permitir que apenas usuários com a role ADMIN possam acessar rotas específicas, como as que adicionam ou removem permissões. Usuários sem esse nível de acesso recebem um código 403 Forbidden.

4. Documentação da API

Para facilitar a integração e o uso da API, toda a documentação foi gerada utilizando OpenAPI. Isso permite que desenvolvedores utilizem a API facilmente, testando todas as funcionalidades diretamente via ferramentas como o Postman.

⚙️ Como Rodar o Projeto

Se você quiser testar a API localmente, basta seguir os passos abaixo:

  1. Clone o repositório:

    git clone https://github.com/DevSolto/Desafio-Node.js.git
    cd seu-repositorio
    
  2. Instale as dependências:

    pnpm install
    
  3. Configure o banco de dados no arquivo .env:

    DATABASE_URL=postgresql://<usuario>:<senha>@<host>:<porta>/<database>
    
  4. Rode as migrações para criar as tabelas no banco de dados:

    pnpm run migrate
    
  5. Inicie o servidor:

    pnpm run dev
    

Agora você pode testar todas as rotas utilizando o Postman ou outra ferramenta de sua escolha.

🧠 Lições Aprendidas

Este desafio foi uma ótima oportunidade para aprofundar meus conhecimentos em:

  • Autenticação e autorização: Trabalhei diretamente com o gerenciamento de tokens JWT e controle de acesso baseado em roles.
  • Boas práticas de desenvolvimento: Refatorei o código diversas vezes para garantir uma arquitetura limpa e escalável.
  • Documentação de API: A documentação com OpenAPI facilitou muito o processo de consumo da API, garantindo que ela seja de fácil integração para outros desenvolvedores.

📜 Conclusão

Criar uma API que lida com autenticação e autorização é uma das tarefas mais críticas no desenvolvimento de back-end, pois a segurança é essencial para garantir que os dados dos usuários sejam protegidos. Este projeto foi um excelente exercício para fortalecer minhas habilidades nessa área.

Se você quiser ver o código completo, ele está disponível no meu GitHub.

Feedbacks e sugestões são sempre bem-vindos!


🔗 Conecte-se Comigo

Se você também trabalha com Node.js ou tem interesse em desenvolvimento de APIs, vamos conectar! Estou sempre em busca de novas oportunidades e desafios.

Carregando publicação patrocinada...
4

Muito massa fazer esses exercícios de projetinhos completos, o seu ficou muito bem feito e organizado, parabéns! Como sugestão, eu tenho 2 pontos que podem agregar um bocadinho:

  • Error Handler: Em quase todas as rotas você repete os mesmos tratamentos de erro, esse caminho foi proposital? O Fastify tem uma forma de tratar os erros de forma global, de uma maneira muito prática. Segue um link da documentação

  • Fastify + Swagger: Vi que você já criou uma documentação com o Swagger, mas o que acha da idéia da documentação estar totalmente integrada ao código? O Fastify tem um plugin oficial pra te ajudar nessa questão, o @fastify/swagger, com ele você consegue criar as documentações diretamente nas rotas, facilitando muito a vida. Ainda é possível misturar tudo isso com o Zod e deixar as coisas ainda mais fáceis, se liga só nessa lib.

Bora nos conectar! Também trabalho com Node.JS e ultimamente venho tentado me desafiar. Fico a disposição para colaborar contigo. Deixarei aqui minhas redes:

Linkedin
Github

2

Concordo muito com você Jonatan, estou implementando também na minha API em Node, não estou usando Fastify mas o Swagger sim, e fazer a documentação na mão é chatinho mas muito necessário, estou focando em melhorar a documentação.

Outro ponto seria de Reset da Senha, implementei recentemente essa funcionalidade e fazemos um token temporário para então validar esse token e deixar o usuário refazer a senha, também conta com o JWT, acho muito show.

2

Muito obrigado pelo feedback, isso ajuda muito na minha evolução. A questão do tratamento de erro não foi proposital, foi falta de conhecimento msm 😅.
Gostei muito das suas dicas vou estudar sobre

1

bom dia, sr.

como vc aplicaria o que vc aprendeu acima para com aquele problema de 6 meses atrás da tua faculdade? vc postou no tabnews.

"ser um sistema para automatizar o processo de pedido de produtos (salgados e doces) das cafeterias e lanchonetes da faculdade a umacozinha principal"

será que vc aplicaria execução no lado do servidor para esta solução?

vc já conseguiu resolver? como foi?
quais tecnologias vc utilizou?
vomo cada uma te auxiliou?

que tal fazer uma publicação sobre isso? seria bastante interessante.

na minha faculdade, tivemos de realizar o desenvolvimento de um crud para fichas de cadastro para assistência social. foi um projeto curricular.

o projeto da tua faculdade também é curricular? vc está com mais alguém na equipe, certo? como está sendo ensinar a eles? quais foram as dificuldades? lembro que vc comentou que era o mais experiente.
nos últimos 6 meses, eles evoluíram de alguma forma?

vc está utilizando apenas conhecimentos da faculdade para desenvolver aquela solução? produziram documentação?
há algum prof orientando? é extensão universitária?

se possível, faça um post focando nisso, com tua escrita. será legal apreciar a contribuição.

aguardo retorno.

1
1
1

Amigo te deram quanto tempo pra fazer?
Algum momento você fez sob observação?
Na verdade que acho isso simples até de ser feito, mas eu sempre, sempre pesquiso alguma coisa durante o desenvolvimento, as vezes eu já tenho projeto meu pronto que implementa o que quero e copio e colo, as vezes eu pesquiso no Stack overflow, as vezes peço ao GPT pra implementar as coisas repetitivas, como entradades, Scripts... E não me sinto bem com alguém observando eu fazendo este tipo de prática.

2

Não teve limite de tempo eu executei em 2 dias pois nao tava totalmente focado nesse desafio e não peve supervisão, pois é um desafio publico que tem la no fithub

0