jerkjs 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +200 -0
- package/README.md +171 -0
- package/doc/EXTENSION_MANUAL.md +958 -0
- package/doc/FIREWALL_MANUAL.md +419 -0
- package/doc/HOOKS_REFERENCE_IMPROVED.md +599 -0
- package/doc/MANUAL_API_SDK.md +539 -0
- package/doc/MANUAL_MVC.md +397 -0
- package/doc/MARIADB_TOKENS_IMPLEMENTATION.md +113 -0
- package/doc/MIDDLEWARE_MANUAL.md +521 -0
- package/doc/OAUTH2_GOOGLE_MANUAL.md +408 -0
- package/doc/frontend-and-sessions.md +356 -0
- package/examples/advanced/controllers/productController.js +64 -0
- package/examples/advanced/controllers/userController.js +85 -0
- package/examples/advanced/routes.json +51 -0
- package/examples/advanced_example.js +93 -0
- package/examples/basic/controllers/userController.js +85 -0
- package/examples/basic_example.js +72 -0
- package/examples/frontend/README.md +71 -0
- package/examples/frontend/app.js +71 -0
- package/examples/frontend/controllers/apiController.js +39 -0
- package/examples/frontend/controllers/authController.js +220 -0
- package/examples/frontend/controllers/formController.js +47 -0
- package/examples/frontend/controllers/messageController.js +96 -0
- package/examples/frontend/controllers/pageController.js +178 -0
- package/examples/frontend/controllers/staticController.js +167 -0
- package/examples/frontend/routes.json +90 -0
- package/examples/mvc_example/app.js +138 -0
- package/examples/mvc_example/views/home/index.html +26 -0
- package/examples/mvc_example/views/home/simple.html +3 -0
- package/examples/mvc_example/views/layout.html +23 -0
- package/examples/mvc_example/views/test.html +3 -0
- package/examples/mvc_example/views/user/invalid.html +6 -0
- package/examples/mvc_example/views/user/list.html +36 -0
- package/examples/mvc_example/views/user/notfound.html +6 -0
- package/examples/mvc_example/views/user/profile.html +11 -0
- package/examples/mvc_routes_example/app.js +34 -0
- package/examples/mvc_routes_example/controllers/mainController.js +27 -0
- package/examples/mvc_routes_example/controllers/productController.js +47 -0
- package/examples/mvc_routes_example/controllers/userController.js +76 -0
- package/examples/mvc_routes_example/routes.json +30 -0
- package/examples/mvc_routes_example/views/layout.html +31 -0
- package/examples/mvc_routes_example/views/main/index.html +11 -0
- package/examples/mvc_routes_example/views/product/catalog.html +24 -0
- package/examples/mvc_routes_example/views/user/invalid.html +6 -0
- package/examples/mvc_routes_example/views/user/list.html +40 -0
- package/examples/mvc_routes_example/views/user/notfound.html +6 -0
- package/examples/mvc_routes_example/views/user/profile.html +18 -0
- package/examples/public/README.md +92 -0
- package/examples/public/app.js +72 -0
- package/examples/public/controllers/healthController.js +20 -0
- package/examples/public/controllers/mainController.js +22 -0
- package/examples/public/controllers/userController.js +139 -0
- package/examples/public/routes.json +51 -0
- package/examples/v2/README.md +72 -0
- package/examples/v2/app.js +74 -0
- package/examples/v2/app_fixed.js +74 -0
- package/examples/v2/controllers/authController.js +64 -0
- package/examples/v2/controllers/mainController.js +24 -0
- package/examples/v2/controllers/protectedController.js +12 -0
- package/examples/v2/controllers/userController.js +16 -0
- package/examples/v2/package.json +27 -0
- package/examples/v2/routes.json +30 -0
- package/examples/v2/test_api.sh +47 -0
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +113 -0
- package/examples/v2.1_firewall_demo/app.js +182 -0
- package/examples/v2.1_firewall_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/README.md +85 -0
- package/examples/v2.1_hooks_demo/app.js +101 -0
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
- package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
- package/examples/v2.1_hooks_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/routes.json +16 -0
- package/examples/v2.1_openapi_demo/README.md +82 -0
- package/examples/v2.1_openapi_demo/app.js +296 -0
- package/examples/v2.1_openapi_demo/package.json +26 -0
- package/examples/v2_cors/README.md +82 -0
- package/examples/v2_cors/app.js +108 -0
- package/examples/v2_cors/package.json +23 -0
- package/examples/v2_json_auth/README.md +83 -0
- package/examples/v2_json_auth/app.js +72 -0
- package/examples/v2_json_auth/controllers/authController.js +67 -0
- package/examples/v2_json_auth/controllers/mainController.js +16 -0
- package/examples/v2_json_auth/controllers/protectedController.js +12 -0
- package/examples/v2_json_auth/controllers/tokenController.js +28 -0
- package/examples/v2_json_auth/controllers/userController.js +15 -0
- package/examples/v2_json_auth/package.json +26 -0
- package/examples/v2_json_auth/routes.json +37 -0
- package/examples/v2_json_auth/tokens.json +20 -0
- package/examples/v2_mariadb_auth/README.md +94 -0
- package/examples/v2_mariadb_auth/app.js +81 -0
- package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
- package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
- package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
- package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
- package/examples/v2_mariadb_auth/package.json +27 -0
- package/examples/v2_mariadb_auth/routes.json +37 -0
- package/examples/v2_no_auth/README.md +75 -0
- package/examples/v2_no_auth/app.js +72 -0
- package/examples/v2_no_auth/controllers/healthController.js +14 -0
- package/examples/v2_no_auth/controllers/mainController.js +19 -0
- package/examples/v2_no_auth/controllers/productController.js +31 -0
- package/examples/v2_no_auth/controllers/publicController.js +16 -0
- package/examples/v2_no_auth/package.json +22 -0
- package/examples/v2_no_auth/routes.json +37 -0
- package/examples/v2_oauth/README.md +70 -0
- package/examples/v2_oauth/app.js +90 -0
- package/examples/v2_oauth/controllers/mainController.js +45 -0
- package/examples/v2_oauth/controllers/oauthController.js +247 -0
- package/examples/v2_oauth/controllers/protectedController.js +13 -0
- package/examples/v2_oauth/controllers/userController.js +17 -0
- package/examples/v2_oauth/package.json +26 -0
- package/examples/v2_oauth/routes.json +44 -0
- package/examples/v2_openapi/README.md +77 -0
- package/examples/v2_openapi/app.js +222 -0
- package/examples/v2_openapi/controllers/authController.js +52 -0
- package/examples/v2_openapi/controllers/mainController.js +26 -0
- package/examples/v2_openapi/controllers/productController.js +17 -0
- package/examples/v2_openapi/controllers/userController.js +27 -0
- package/examples/v2_openapi/package.json +26 -0
- package/examples/v2_openapi/routes.json +37 -0
- package/generate_token.js +10 -0
- package/index.js +85 -0
- package/jerk.jpg +0 -0
- package/lib/core/handler.js +86 -0
- package/lib/core/hooks.js +224 -0
- package/lib/core/router.js +204 -0
- package/lib/core/securityEnhancedServer.js +752 -0
- package/lib/core/server.js +369 -0
- package/lib/loader/controllerLoader.js +175 -0
- package/lib/loader/routeLoader.js +341 -0
- package/lib/middleware/auditLogger.js +208 -0
- package/lib/middleware/authenticator.js +565 -0
- package/lib/middleware/compressor.js +218 -0
- package/lib/middleware/cors.js +135 -0
- package/lib/middleware/firewall.js +443 -0
- package/lib/middleware/rateLimiter.js +210 -0
- package/lib/middleware/session.js +301 -0
- package/lib/middleware/validator.js +193 -0
- package/lib/mvc/controllerBase.js +207 -0
- package/lib/mvc/viewEngine.js +752 -0
- package/lib/utils/configParser.js +223 -0
- package/lib/utils/logger.js +145 -0
- package/lib/utils/mariadbTokenAdapter.js +226 -0
- package/lib/utils/openapiGenerator.js +140 -0
- package/lib/utils/sqliteTokenAdapter.js +224 -0
- package/lib/utils/tokenManager.js +254 -0
- package/package.json +47 -0
- package/v2examplle/v2_json_auth/README.md +83 -0
- package/v2examplle/v2_json_auth/app.js +72 -0
- package/v2examplle/v2_json_auth/controllers/authController.js +67 -0
- package/v2examplle/v2_json_auth/controllers/mainController.js +16 -0
- package/v2examplle/v2_json_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_json_auth/controllers/tokenController.js +28 -0
- package/v2examplle/v2_json_auth/controllers/userController.js +15 -0
- package/v2examplle/v2_json_auth/package.json +26 -0
- package/v2examplle/v2_json_auth/routes.json +37 -0
- package/v2examplle/v2_json_auth/tokens.json +20 -0
- package/v2examplle/v2_mariadb_auth/README.md +94 -0
- package/v2examplle/v2_mariadb_auth/app.js +81 -0
- package/v2examplle/v2_mariadb_auth/controllers/authController.js +95 -0
- package/v2examplle/v2_mariadb_auth/controllers/mainController.js +31 -0
- package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_mariadb_auth/controllers/userController.js +17 -0
- package/v2examplle/v2_mariadb_auth/package.json +27 -0
- package/v2examplle/v2_mariadb_auth/routes.json +37 -0
- package/v2examplle/v2_sqlite_auth/README.md +72 -0
- package/v2examplle/v2_sqlite_auth/app.js +74 -0
- package/v2examplle/v2_sqlite_auth/app_fixed.js +74 -0
- package/v2examplle/v2_sqlite_auth/controllers/authController.js +64 -0
- package/v2examplle/v2_sqlite_auth/controllers/mainController.js +24 -0
- package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_sqlite_auth/controllers/userController.js +16 -0
- package/v2examplle/v2_sqlite_auth/package.json +27 -0
- package/v2examplle/v2_sqlite_auth/routes.json +30 -0
- package/v2examplle/v2_sqlite_auth/test_api.sh +47 -0
- package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Ejemplo API Pública sin Autenticación
|
|
2
|
+
|
|
3
|
+
Este ejemplo demuestra cómo crear una API pública sin autenticación utilizando el Framework API SDK.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- API completamente pública sin requerir tokens o autenticación
|
|
8
|
+
- Rutas para diferentes tipos de datos
|
|
9
|
+
- Documentación OpenAPI generada automáticamente
|
|
10
|
+
- Endpoints de ejemplo para productos y datos públicos
|
|
11
|
+
|
|
12
|
+
## Configuración
|
|
13
|
+
|
|
14
|
+
No se requieren dependencias adicionales más allá del Framework API SDK.
|
|
15
|
+
|
|
16
|
+
## Uso
|
|
17
|
+
|
|
18
|
+
1. Inicia el servidor:
|
|
19
|
+
```bash
|
|
20
|
+
node app.js
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
2. El servidor escuchará en `http://localhost:8089`
|
|
24
|
+
|
|
25
|
+
## Endpoints
|
|
26
|
+
|
|
27
|
+
- `GET /` - Página de inicio
|
|
28
|
+
- `GET /public` - Datos públicos de ejemplo
|
|
29
|
+
- `GET /products` - Lista de productos
|
|
30
|
+
- `GET /products/:id` - Producto específico por ID
|
|
31
|
+
- `GET /health` - Estado del servicio
|
|
32
|
+
- `GET /docs` - Documentación interactiva de la API
|
|
33
|
+
- `GET /openapi.json` - Especificación OpenAPI
|
|
34
|
+
|
|
35
|
+
## Ejemplo de uso
|
|
36
|
+
|
|
37
|
+
1. Consultar productos:
|
|
38
|
+
```bash
|
|
39
|
+
curl http://localhost:8089/products
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
2. Consultar producto específico:
|
|
43
|
+
```bash
|
|
44
|
+
curl http://localhost:8089/products/1
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
3. Consultar datos públicos:
|
|
48
|
+
```bash
|
|
49
|
+
curl http://localhost:8089/public
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
4. Ver estado del servicio:
|
|
53
|
+
```bash
|
|
54
|
+
curl http://localhost:8089/health
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Estructura del proyecto
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
examples/v2_no_auth/
|
|
61
|
+
├── app.js # Punto de entrada de la aplicación
|
|
62
|
+
├── routes.json # Definición de rutas
|
|
63
|
+
├── controllers/ # Controladores de las rutas
|
|
64
|
+
│ ├── mainController.js
|
|
65
|
+
│ ├── publicController.js
|
|
66
|
+
│ ├── productController.js
|
|
67
|
+
│ └── healthController.js
|
|
68
|
+
└── README.md
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Notas
|
|
72
|
+
|
|
73
|
+
- Esta API no requiere autenticación, por lo que todos los endpoints son públicos
|
|
74
|
+
- Adecuada para servicios públicos, APIs de datos abiertos o prototipos
|
|
75
|
+
- La documentación OpenAPI se genera automáticamente y está disponible en `/docs`
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const {
|
|
2
|
+
APIServer,
|
|
3
|
+
RouteLoader,
|
|
4
|
+
Logger,
|
|
5
|
+
OpenApiGenerator
|
|
6
|
+
} = require('../../index.js');
|
|
7
|
+
|
|
8
|
+
async function startServer() {
|
|
9
|
+
// Crear instancia del servidor
|
|
10
|
+
const server = new APIServer({
|
|
11
|
+
port: 8089,
|
|
12
|
+
host: 'localhost'
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// Crear instancia del logger
|
|
16
|
+
const logger = new Logger({ level: 'info' });
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
// Cargar rutas desde archivo JSON
|
|
20
|
+
const routeLoader = new RouteLoader();
|
|
21
|
+
await routeLoader.loadRoutes(server, './routes.json');
|
|
22
|
+
|
|
23
|
+
// Crear instancia del generador de OpenAPI
|
|
24
|
+
const openApiGenerator = new OpenApiGenerator({
|
|
25
|
+
title: 'API Pública de Ejemplo',
|
|
26
|
+
description: 'Una API pública sin autenticación',
|
|
27
|
+
version: '1.0.0'
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Agregar rutas a la documentación OpenAPI
|
|
31
|
+
openApiGenerator.addRoute({
|
|
32
|
+
path: '/public',
|
|
33
|
+
method: 'GET',
|
|
34
|
+
config: {
|
|
35
|
+
summary: 'Endpoint público de ejemplo',
|
|
36
|
+
description: 'Devuelve datos públicos sin requerir autenticación',
|
|
37
|
+
responses: {
|
|
38
|
+
'200': {
|
|
39
|
+
description: 'Datos públicos',
|
|
40
|
+
content: {
|
|
41
|
+
'application/json': {
|
|
42
|
+
schema: {
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: {
|
|
45
|
+
message: { type: 'string' },
|
|
46
|
+
timestamp: { type: 'string' }
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Agregar ruta de documentación al servidor
|
|
57
|
+
openApiGenerator.addDocumentationRoute(server);
|
|
58
|
+
|
|
59
|
+
// Iniciar el servidor
|
|
60
|
+
server.start();
|
|
61
|
+
|
|
62
|
+
logger.info('Servidor iniciado en http://localhost:8089');
|
|
63
|
+
} catch (error) {
|
|
64
|
+
logger.error('Error iniciando el servidor:', error.message);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Iniciar el servidor
|
|
70
|
+
startServer();
|
|
71
|
+
|
|
72
|
+
module.exports = { startServer };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const healthController = {
|
|
2
|
+
getStatus: (req, res) => {
|
|
3
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4
|
+
res.end(JSON.stringify({
|
|
5
|
+
status: 'healthy',
|
|
6
|
+
uptime: process.uptime(),
|
|
7
|
+
timestamp: new Date().toISOString(),
|
|
8
|
+
service: 'API Pública de Ejemplo',
|
|
9
|
+
version: '1.0.0'
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
module.exports = healthController;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const mainController = {
|
|
2
|
+
home: (req, res) => {
|
|
3
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4
|
+
res.end(JSON.stringify({
|
|
5
|
+
message: 'Bienvenido a la API pública de ejemplo',
|
|
6
|
+
endpoints: {
|
|
7
|
+
'GET /': 'Esta página de inicio',
|
|
8
|
+
'GET /public': 'Datos públicos de ejemplo',
|
|
9
|
+
'GET /products': 'Lista de productos',
|
|
10
|
+
'GET /products/:id': 'Producto por ID',
|
|
11
|
+
'GET /health': 'Estado del servicio',
|
|
12
|
+
'GET /docs': 'Documentación interactiva de la API',
|
|
13
|
+
'GET /openapi.json': 'Especificación OpenAPI'
|
|
14
|
+
}
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
module.exports = mainController;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Datos de ejemplo de productos
|
|
2
|
+
const products = [
|
|
3
|
+
{ id: 1, name: 'Laptop', price: 999.99, category: 'Electronics' },
|
|
4
|
+
{ id: 2, name: 'Mouse', price: 29.99, category: 'Electronics' },
|
|
5
|
+
{ id: 3, name: 'Keyboard', price: 79.99, category: 'Electronics' },
|
|
6
|
+
{ id: 4, name: 'Monitor', price: 299.99, category: 'Electronics' },
|
|
7
|
+
{ id: 5, name: 'Webcam', price: 89.99, category: 'Electronics' }
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
const productController = {
|
|
11
|
+
getAllProducts: (req, res) => {
|
|
12
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
13
|
+
res.end(JSON.stringify(products));
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
getProductById: (req, res) => {
|
|
17
|
+
const productId = parseInt(req.params.id);
|
|
18
|
+
const product = products.find(p => p.id === productId);
|
|
19
|
+
|
|
20
|
+
if (!product) {
|
|
21
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
22
|
+
res.end(JSON.stringify({ error: 'Producto no encontrado' }));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
27
|
+
res.end(JSON.stringify(product));
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
module.exports = productController;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const publicController = {
|
|
2
|
+
getPublicData: (req, res) => {
|
|
3
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4
|
+
res.end(JSON.stringify({
|
|
5
|
+
message: 'Este es un endpoint público sin autenticación',
|
|
6
|
+
timestamp: new Date().toISOString(),
|
|
7
|
+
data: {
|
|
8
|
+
randomValue: Math.floor(Math.random() * 100),
|
|
9
|
+
serverStatus: 'operational',
|
|
10
|
+
publicInfo: 'Esta información es accesible para todos'
|
|
11
|
+
}
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
module.exports = publicController;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "api-sdk-public-example",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Ejemplo de API pública sin autenticación usando el Framework API SDK",
|
|
5
|
+
"main": "app.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "node app.js",
|
|
8
|
+
"dev": "nodemon app.js"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"api",
|
|
12
|
+
"sdk",
|
|
13
|
+
"public",
|
|
14
|
+
"no-authentication",
|
|
15
|
+
"framework"
|
|
16
|
+
],
|
|
17
|
+
"author": "API SDK Framework",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"nodemon": "^3.0.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"path": "/",
|
|
4
|
+
"method": "GET",
|
|
5
|
+
"controller": "./controllers/mainController.js",
|
|
6
|
+
"handler": "home",
|
|
7
|
+
"auth": "none"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"path": "/public",
|
|
11
|
+
"method": "GET",
|
|
12
|
+
"controller": "./controllers/publicController.js",
|
|
13
|
+
"handler": "getPublicData",
|
|
14
|
+
"auth": "none"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"path": "/products",
|
|
18
|
+
"method": "GET",
|
|
19
|
+
"controller": "./controllers/productController.js",
|
|
20
|
+
"handler": "getAllProducts",
|
|
21
|
+
"auth": "none"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"path": "/products/:id",
|
|
25
|
+
"method": "GET",
|
|
26
|
+
"controller": "./controllers/productController.js",
|
|
27
|
+
"handler": "getProductById",
|
|
28
|
+
"auth": "none"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "/health",
|
|
32
|
+
"method": "GET",
|
|
33
|
+
"controller": "./controllers/healthController.js",
|
|
34
|
+
"handler": "getStatus",
|
|
35
|
+
"auth": "none"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Ejemplo API con Funcionalidad OAuth 2.0
|
|
2
|
+
|
|
3
|
+
Este ejemplo demuestra cómo implementar autenticación OAuth 2.0 usando el Framework API SDK.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- Implementación de flujo OAuth 2.0 (simulado para demostración)
|
|
8
|
+
- Generación de tokens JWT tras autenticación OAuth
|
|
9
|
+
- Rutas protegidas que requieren tokens JWT
|
|
10
|
+
- Simulación del proceso de autorización y callback
|
|
11
|
+
- Controladores organizados por funcionalidad
|
|
12
|
+
|
|
13
|
+
## Configuración
|
|
14
|
+
|
|
15
|
+
Este ejemplo simula el flujo OAuth para fines de demostración. En un entorno real, necesitarías:
|
|
16
|
+
|
|
17
|
+
1. Registrar tu aplicación con un proveedor OAuth (Google, GitHub, etc.)
|
|
18
|
+
2. Obtener Client ID y Client Secret
|
|
19
|
+
3. Configurar la URL de callback en tu aplicación
|
|
20
|
+
4. Ajustar las rutas y controladores según tus necesidades
|
|
21
|
+
|
|
22
|
+
## Uso
|
|
23
|
+
|
|
24
|
+
1. Inicia el servidor:
|
|
25
|
+
```bash
|
|
26
|
+
node app.js
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
2. El servidor escuchará en `http://localhost:8093`
|
|
30
|
+
|
|
31
|
+
## Endpoints
|
|
32
|
+
|
|
33
|
+
- `GET /` - Página de inicio con instrucciones
|
|
34
|
+
- `GET /auth/google` - Iniciar flujo OAuth con Google (simulado)
|
|
35
|
+
- `GET /auth/callback` - Callback de OAuth (simulado)
|
|
36
|
+
- `GET /profile` - Perfil de usuario (requiere token JWT)
|
|
37
|
+
- `GET /protected` - Contenido protegido (requiere token JWT)
|
|
38
|
+
|
|
39
|
+
## Flujo de OAuth simulado
|
|
40
|
+
|
|
41
|
+
1. Visita `/auth/google` para iniciar el proceso OAuth
|
|
42
|
+
2. El sistema simulará la redirección a Google y el callback
|
|
43
|
+
3. Se generará un token JWT para el usuario autenticado
|
|
44
|
+
4. Usa el token para acceder a endpoints protegidos
|
|
45
|
+
|
|
46
|
+
## Estructura del proyecto
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
examples/v2_oauth/
|
|
50
|
+
├── app.js # Punto de entrada de la aplicación
|
|
51
|
+
├── routes.json # Definición de rutas
|
|
52
|
+
├── controllers/ # Controladores de las rutas
|
|
53
|
+
│ ├── mainController.js
|
|
54
|
+
│ ├── oauthController.js
|
|
55
|
+
│ ├── userController.js
|
|
56
|
+
│ └── protectedController.js
|
|
57
|
+
└── README.md
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Implementación real
|
|
61
|
+
|
|
62
|
+
Para implementar OAuth en un entorno real:
|
|
63
|
+
|
|
64
|
+
1. Registra tu aplicación con un proveedor OAuth
|
|
65
|
+
2. Configura las credenciales en el código
|
|
66
|
+
3. Implementa la lógica para intercambiar el código de autorización por tokens
|
|
67
|
+
4. Almacena de forma segura los tokens de acceso y refresh
|
|
68
|
+
5. Usa los tokens para acceder a las APIs del proveedor
|
|
69
|
+
|
|
70
|
+
El framework proporciona la estrategia `oauth2Strategy` que puedes usar con tus credenciales reales.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const {
|
|
2
|
+
APIServer,
|
|
3
|
+
Authenticator,
|
|
4
|
+
RouteLoader,
|
|
5
|
+
Logger,
|
|
6
|
+
TokenManager
|
|
7
|
+
} = require('../../index.js');
|
|
8
|
+
|
|
9
|
+
async function startServer() {
|
|
10
|
+
// Crear instancia del servidor
|
|
11
|
+
const server = new APIServer({
|
|
12
|
+
port: 8093,
|
|
13
|
+
host: 'localhost'
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// Crear instancia del logger
|
|
17
|
+
const logger = new Logger({ level: 'info' });
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
// Crear instancia del TokenManager
|
|
21
|
+
const tokenManager = new TokenManager({
|
|
22
|
+
storage: 'memory'
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Crear instancia del autenticador
|
|
26
|
+
const authenticator = new Authenticator({ logger });
|
|
27
|
+
|
|
28
|
+
// Registrar estrategia de autenticación OAuth2 REAL del framework
|
|
29
|
+
// Esta es la verdadera implementación del framework
|
|
30
|
+
authenticator.use('oauth2', authenticator.oauth2Strategy({
|
|
31
|
+
clientId: process.env.OAUTH_CLIENT_ID || 'tu-client-id-aqui',
|
|
32
|
+
clientSecret: process.env.OAUTH_CLIENT_SECRET || 'tu-client-secret-aqui',
|
|
33
|
+
callbackURL: 'http://localhost:8093/auth/callback',
|
|
34
|
+
authorizationURL: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
35
|
+
tokenURL: 'https://oauth2.googleapis.com/token'
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
// Registrar estrategia JWT para tokens generados internamente
|
|
39
|
+
authenticator.use('jwt-oauth', async (req, options = {}) => {
|
|
40
|
+
const authHeader = req.headers.authorization;
|
|
41
|
+
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
|
|
42
|
+
|
|
43
|
+
if (!token) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Validar el token usando el secreto de las variables de entorno
|
|
48
|
+
const secret = process.env.JWT_SECRET;
|
|
49
|
+
|
|
50
|
+
// Verificar que el secreto esté definido
|
|
51
|
+
if (!secret) {
|
|
52
|
+
logger.error('JWT_SECRET no está definido en las variables de entorno');
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const decoded = tokenManager.validateToken(token, secret);
|
|
57
|
+
|
|
58
|
+
if (decoded) {
|
|
59
|
+
req.user = decoded;
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return false;
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Agregar el autenticador al servidor para que pueda ser usado por el RouteLoader
|
|
67
|
+
server.authenticator = authenticator;
|
|
68
|
+
|
|
69
|
+
// Cargar rutas desde archivo JSON
|
|
70
|
+
const routeLoader = new RouteLoader();
|
|
71
|
+
await routeLoader.loadRoutes(server, './routes.json');
|
|
72
|
+
|
|
73
|
+
// Iniciar el servidor
|
|
74
|
+
server.start();
|
|
75
|
+
|
|
76
|
+
logger.info('Servidor iniciado en http://localhost:8093');
|
|
77
|
+
logger.info('Configura tus credenciales OAuth para usar la autenticación real');
|
|
78
|
+
logger.info('Variables de entorno necesarias:');
|
|
79
|
+
logger.info('- OAUTH_CLIENT_ID: Tu Client ID de Google OAuth');
|
|
80
|
+
logger.info('- OAUTH_CLIENT_SECRET: Tu Client Secret de Google OAuth');
|
|
81
|
+
} catch (error) {
|
|
82
|
+
logger.error('Error iniciando el servidor:', error.message);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Iniciar el servidor
|
|
88
|
+
startServer();
|
|
89
|
+
|
|
90
|
+
module.exports = { startServer };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const mainController = {
|
|
2
|
+
home: (req, res) => {
|
|
3
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
4
|
+
res.end(`
|
|
5
|
+
<!DOCTYPE html>
|
|
6
|
+
<html>
|
|
7
|
+
<head>
|
|
8
|
+
<title>Ejemplo OAuth con API SDK Framework</title>
|
|
9
|
+
<style>
|
|
10
|
+
body { font-family: Arial, sans-serif; margin: 40px; }
|
|
11
|
+
.endpoint { margin: 10px 0; padding: 10px; background-color: #f0f0f0; border-radius: 5px; }
|
|
12
|
+
a { color: #007bff; text-decoration: none; }
|
|
13
|
+
a:hover { text-decoration: underline; }
|
|
14
|
+
</style>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<h1>Ejemplo OAuth con API SDK Framework</h1>
|
|
18
|
+
<p>Este ejemplo demuestra la funcionalidad OAuth 2.0 del framework.</p>
|
|
19
|
+
|
|
20
|
+
<h2>Endpoints disponibles:</h2>
|
|
21
|
+
<div class="endpoint">
|
|
22
|
+
<strong><a href="/auth/google">GET /auth/google</a></strong> - Iniciar flujo OAuth con Google
|
|
23
|
+
</div>
|
|
24
|
+
<div class="endpoint">
|
|
25
|
+
<strong><a href="/profile">GET /profile</a></strong> - Perfil de usuario (requiere token JWT)
|
|
26
|
+
</div>
|
|
27
|
+
<div class="endpoint">
|
|
28
|
+
<strong><a href="/protected">GET /protected</a></strong> - Contenido protegido (requiere token JWT)
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<h2>Instrucciones:</h2>
|
|
32
|
+
<ol>
|
|
33
|
+
<li>Visita <a href="/auth/google">/auth/google</a> para iniciar el flujo OAuth</li>
|
|
34
|
+
<li>El callback OAuth manejará la autenticación y generará un token JWT</li>
|
|
35
|
+
<li>Usa el token generado para acceder a los endpoints protegidos</li>
|
|
36
|
+
</ol>
|
|
37
|
+
|
|
38
|
+
<p><em>Nota: Este es un ejemplo funcional. En un entorno real, necesitarías configurar credenciales reales de OAuth con un proveedor como Google, GitHub, etc.</em></p>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
41
|
+
`);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
module.exports = mainController;
|