diff --git a/.env b/.env new file mode 100644 index 0000000..654bc54 --- /dev/null +++ b/.env @@ -0,0 +1,12 @@ +# Configurações do Banco de Dados +DB_HOST=localhost +DB_USER=root +DB_PASSWORD=sua_senha_aqui +DB_NAME=gameverse_library + +# Configurações do JWT +JWT_SECRET=sua_chave_secreta_aqui_mude_para_producao +JWT_EXPIRES_IN=24h +JWT_ISSUER=https://sistema-distribuido-trabalho-faculd.vercel.app +JWT_AUDIENCE=internal-apis +JWT_PUBLIC_KEY_PEM=-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxf0rOpF9jsaUb+T5uem/\n6lJby0lLqNstP4bpXg4izqzV18ad9gM/mOS+1M8U204/CMBowC2XFVKQITlZ8y3o\n1KrlyUpmTfZrrDHidCII53v3E/N6Vou4hEV5xLQhuE6IsXB4bwDpr+JgAq17IVTf\nUR+ePFY6xmPCimTuGTxNPOJprkY1V1jEYzMHvtk6FSV39eZDp2GM3wnGYk95ib5f\nFd+xRB8kUdrtub5Cifd/ayvF2vsmgsjN41d2qOw6MFsNsXsOXVcrCE/0GvvW5C8B\nRTPCifEPbHJ/Du7ye1yDjHDyiYXnnoZ3cOg6Vla12OnlBRfL6sJBT6VCvIbzQN1z\n7QIDAQAB\n-----END PUBLIC KEY----- \ No newline at end of file diff --git a/CHECKLIST.md b/CHECKLIST.md new file mode 100644 index 0000000..c681b35 --- /dev/null +++ b/CHECKLIST.md @@ -0,0 +1,78 @@ +# Checklist - Microsserviço Biblioteca de Usuário + +## ✅ Implementação do Token JWT + +- [x] Arquivo `.env` criado com configurações JWT +- [x] `JWT_SECRET` configurado +- [x] `JWT_EXPIRES_IN` configurado (24h) +- [x] `JWT_ISSUER` configurado +- [x] `JWT_AUDIENCE` configurado +- [x] `JWT_PUBLIC_KEY_PEM` configurado (chave pública RSA) + +## ✅ Middleware de Autenticação + +- [x] Arquivo `config/authMiddleware.js` criado +- [x] Validação de token no header Authorization +- [x] Verificação de issuer +- [x] Verificação de audience +- [x] Algoritmo RS256 configurado +- [x] Fallback para HS256 (JWT_SECRET) + +## ✅ Rotas Protegidas + +- [x] `POST /library/add` - requer token JWT +- [x] `GET /library/user/:user_id` - requer token JWT +- [x] `POST /library/integration/payment-approved` - pública (integração) + +## ✅ Segurança no Controller + +- [x] `addItem` usa user_id do token (não do body) +- [x] `getLibrary` usa user_id do token (não dos params) + +## ✅ Dependências + +- [x] `jsonwebtoken` instalado +- [x] `dotenv` instalado +- [x] `package.json` atualizado + +## ✅ Arquivos do Projeto + +- [x] `app.js` - carrega dotenv +- [x] `routes/libraryRoutes.js` - rotas com middleware +- [x] `controllers/libraryController.js` - lógica com token +- [x] `config/authMiddleware.js` - validação JWT +- [x] `.env` - configurações + +--- + +## 🚀 Como Testar + +### 1. Iniciar o servidor +```bash +npm start +``` + +### 2. Testar sem token (deve retornar 401) +```bash +GET http://localhost:3005/library/user/1 +``` + +### 3. Testar com token válido (deve retornar 200) +```bash +GET http://localhost:3005/library/user/1 +Authorization: Bearer +``` + +### 4. Testar com token inválido (deve retornar 403) +```bash +GET http://localhost:3005/library/user/1 +Authorization: Bearer token_invalido +``` + +--- + +## 📝 Observações + +- A rota `/integration/payment-approved` é pública pois é chamada por outros microsserviços +- O user_id é extraído do token JWT para garantir segurança +- A chave pública PEM está configurada para RS256 \ No newline at end of file diff --git a/app.js b/app.js index d41613c..29dcf83 100644 --- a/app.js +++ b/app.js @@ -1,29 +1,31 @@ -const express = require('express'); -const cors = require('cors'); -const routes = require('./routes/libraryRoutes'); - -// Este é o coração do nosso microsserviço da Biblioteca do Usuário! -// Aqui eu configuro o servidor Express que vai gerenciar todas as rotas da nossa API. -// É como o porteiro do prédio - recebe as requisições e direciona para os andares certos. -const app = express(); - -// CORS é fundamental para permitir que outros microsserviços (como o frontend ou Laravel central) -// façam requisições para nossa API sem problemas de segurança do navegador. -app.use(cors()); - -// Este middleware transforma o corpo das requisições JSON em objetos JavaScript -// que podemos usar facilmente nos nossos controllers. -app.use(express.json()); - -// Todas as rotas da biblioteca ficam sob o prefixo '/library' -// Isso organiza nossa API e deixa claro que tudo aqui é sobre a biblioteca do usuário. -app.use('/library', routes); - -// O serviço roda na porta 3005 - escolhi uma porta alta para não conflitar -// com outros serviços que podem estar rodando na máquina. -app.listen(3005, () => { - console.log('Library Service rodando na porta 3005'); -}); - -// Desenvolvido por: André de Oliveira Braga e Izadora Lima de Mendonça -// Projeto GameVerse - Microsserviços - Centro Universitário Uninorte - Curso de Sistemas de Informação +require('dotenv').config(); +const express = require('express'); +const cors = require('cors'); +const routes = require('./routes/libraryRoutes'); +const { authenticateToken } = require('./config/authMiddleware'); + +// Este é o coração do nosso microsserviço da Biblioteca do Usuário! +// Aqui eu configuro o servidor Express que vai gerenciar todas as rotas da nossa API. +// É como o porteiro do prédio - recebe as requisições e direciona para os andares certos. +const app = express(); + +// CORS é fundamental para permitir que outros microsserviços (como o frontend ou Laravel central) +// façam requisições para nossa API sem problemas de segurança do navegador. +app.use(cors()); + +// Este middleware transforma o corpo das requisições JSON em objetos JavaScript +// que podemos usar facilmente nos nossos controllers. +app.use(express.json()); + +// Todas as rotas da biblioteca ficam sob o prefixo '/library' +// Isso organiza nossa API e deixa claro que tudo aqui é sobre a biblioteca do usuário. +app.use('/library', routes); + +// O serviço roda na porta 3005 - escolhi uma porta alta para não conflitar +// com outros serviços que podem estar rodando na máquina. +app.listen(3005, () => { + console.log('Library Service rodando na porta 3005'); +}); + +// Desenvolvido por: André de Oliveira Braga e Izadora Lima de Mendonça +// Projeto GameVerse - Microsserviços - Centro Universitário Uninorte - Curso de Sistemas de Informação