Enviar arquivos para "/"
This commit is contained in:
12
.env
Normal file
12
.env
Normal file
@@ -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-----
|
||||||
78
CHECKLIST.md
Normal file
78
CHECKLIST.md
Normal file
@@ -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 <seu_token_jwt>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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
|
||||||
60
app.js
60
app.js
@@ -1,29 +1,31 @@
|
|||||||
const express = require('express');
|
require('dotenv').config();
|
||||||
const cors = require('cors');
|
const express = require('express');
|
||||||
const routes = require('./routes/libraryRoutes');
|
const cors = require('cors');
|
||||||
|
const routes = require('./routes/libraryRoutes');
|
||||||
// Este é o coração do nosso microsserviço da Biblioteca do Usuário!
|
const { authenticateToken } = require('./config/authMiddleware');
|
||||||
// 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.
|
// Este é o coração do nosso microsserviço da Biblioteca do Usuário!
|
||||||
const app = express();
|
// 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.
|
||||||
// CORS é fundamental para permitir que outros microsserviços (como o frontend ou Laravel central)
|
const app = express();
|
||||||
// façam requisições para nossa API sem problemas de segurança do navegador.
|
|
||||||
app.use(cors());
|
// 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.
|
||||||
// Este middleware transforma o corpo das requisições JSON em objetos JavaScript
|
app.use(cors());
|
||||||
// que podemos usar facilmente nos nossos controllers.
|
|
||||||
app.use(express.json());
|
// Este middleware transforma o corpo das requisições JSON em objetos JavaScript
|
||||||
|
// que podemos usar facilmente nos nossos controllers.
|
||||||
// Todas as rotas da biblioteca ficam sob o prefixo '/library'
|
app.use(express.json());
|
||||||
// Isso organiza nossa API e deixa claro que tudo aqui é sobre a biblioteca do usuário.
|
|
||||||
app.use('/library', routes);
|
// 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.
|
||||||
// O serviço roda na porta 3005 - escolhi uma porta alta para não conflitar
|
app.use('/library', routes);
|
||||||
// com outros serviços que podem estar rodando na máquina.
|
|
||||||
app.listen(3005, () => {
|
// O serviço roda na porta 3005 - escolhi uma porta alta para não conflitar
|
||||||
console.log('Library Service rodando na porta 3005');
|
// 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
|
|
||||||
|
// 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
|
||||||
|
|||||||
Reference in New Issue
Block a user