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.
Files changed (177) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +171 -0
  3. package/doc/EXTENSION_MANUAL.md +958 -0
  4. package/doc/FIREWALL_MANUAL.md +419 -0
  5. package/doc/HOOKS_REFERENCE_IMPROVED.md +599 -0
  6. package/doc/MANUAL_API_SDK.md +539 -0
  7. package/doc/MANUAL_MVC.md +397 -0
  8. package/doc/MARIADB_TOKENS_IMPLEMENTATION.md +113 -0
  9. package/doc/MIDDLEWARE_MANUAL.md +521 -0
  10. package/doc/OAUTH2_GOOGLE_MANUAL.md +408 -0
  11. package/doc/frontend-and-sessions.md +356 -0
  12. package/examples/advanced/controllers/productController.js +64 -0
  13. package/examples/advanced/controllers/userController.js +85 -0
  14. package/examples/advanced/routes.json +51 -0
  15. package/examples/advanced_example.js +93 -0
  16. package/examples/basic/controllers/userController.js +85 -0
  17. package/examples/basic_example.js +72 -0
  18. package/examples/frontend/README.md +71 -0
  19. package/examples/frontend/app.js +71 -0
  20. package/examples/frontend/controllers/apiController.js +39 -0
  21. package/examples/frontend/controllers/authController.js +220 -0
  22. package/examples/frontend/controllers/formController.js +47 -0
  23. package/examples/frontend/controllers/messageController.js +96 -0
  24. package/examples/frontend/controllers/pageController.js +178 -0
  25. package/examples/frontend/controllers/staticController.js +167 -0
  26. package/examples/frontend/routes.json +90 -0
  27. package/examples/mvc_example/app.js +138 -0
  28. package/examples/mvc_example/views/home/index.html +26 -0
  29. package/examples/mvc_example/views/home/simple.html +3 -0
  30. package/examples/mvc_example/views/layout.html +23 -0
  31. package/examples/mvc_example/views/test.html +3 -0
  32. package/examples/mvc_example/views/user/invalid.html +6 -0
  33. package/examples/mvc_example/views/user/list.html +36 -0
  34. package/examples/mvc_example/views/user/notfound.html +6 -0
  35. package/examples/mvc_example/views/user/profile.html +11 -0
  36. package/examples/mvc_routes_example/app.js +34 -0
  37. package/examples/mvc_routes_example/controllers/mainController.js +27 -0
  38. package/examples/mvc_routes_example/controllers/productController.js +47 -0
  39. package/examples/mvc_routes_example/controllers/userController.js +76 -0
  40. package/examples/mvc_routes_example/routes.json +30 -0
  41. package/examples/mvc_routes_example/views/layout.html +31 -0
  42. package/examples/mvc_routes_example/views/main/index.html +11 -0
  43. package/examples/mvc_routes_example/views/product/catalog.html +24 -0
  44. package/examples/mvc_routes_example/views/user/invalid.html +6 -0
  45. package/examples/mvc_routes_example/views/user/list.html +40 -0
  46. package/examples/mvc_routes_example/views/user/notfound.html +6 -0
  47. package/examples/mvc_routes_example/views/user/profile.html +18 -0
  48. package/examples/public/README.md +92 -0
  49. package/examples/public/app.js +72 -0
  50. package/examples/public/controllers/healthController.js +20 -0
  51. package/examples/public/controllers/mainController.js +22 -0
  52. package/examples/public/controllers/userController.js +139 -0
  53. package/examples/public/routes.json +51 -0
  54. package/examples/v2/README.md +72 -0
  55. package/examples/v2/app.js +74 -0
  56. package/examples/v2/app_fixed.js +74 -0
  57. package/examples/v2/controllers/authController.js +64 -0
  58. package/examples/v2/controllers/mainController.js +24 -0
  59. package/examples/v2/controllers/protectedController.js +12 -0
  60. package/examples/v2/controllers/userController.js +16 -0
  61. package/examples/v2/package.json +27 -0
  62. package/examples/v2/routes.json +30 -0
  63. package/examples/v2/test_api.sh +47 -0
  64. package/examples/v2/tokens_example.sqlite +0 -0
  65. package/examples/v2.1_firewall_demo/README.md +113 -0
  66. package/examples/v2.1_firewall_demo/app.js +182 -0
  67. package/examples/v2.1_firewall_demo/package.json +27 -0
  68. package/examples/v2.1_hooks_demo/README.md +85 -0
  69. package/examples/v2.1_hooks_demo/app.js +101 -0
  70. package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
  71. package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
  72. package/examples/v2.1_hooks_demo/package.json +27 -0
  73. package/examples/v2.1_hooks_demo/routes.json +16 -0
  74. package/examples/v2.1_openapi_demo/README.md +82 -0
  75. package/examples/v2.1_openapi_demo/app.js +296 -0
  76. package/examples/v2.1_openapi_demo/package.json +26 -0
  77. package/examples/v2_cors/README.md +82 -0
  78. package/examples/v2_cors/app.js +108 -0
  79. package/examples/v2_cors/package.json +23 -0
  80. package/examples/v2_json_auth/README.md +83 -0
  81. package/examples/v2_json_auth/app.js +72 -0
  82. package/examples/v2_json_auth/controllers/authController.js +67 -0
  83. package/examples/v2_json_auth/controllers/mainController.js +16 -0
  84. package/examples/v2_json_auth/controllers/protectedController.js +12 -0
  85. package/examples/v2_json_auth/controllers/tokenController.js +28 -0
  86. package/examples/v2_json_auth/controllers/userController.js +15 -0
  87. package/examples/v2_json_auth/package.json +26 -0
  88. package/examples/v2_json_auth/routes.json +37 -0
  89. package/examples/v2_json_auth/tokens.json +20 -0
  90. package/examples/v2_mariadb_auth/README.md +94 -0
  91. package/examples/v2_mariadb_auth/app.js +81 -0
  92. package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
  93. package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
  94. package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
  95. package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
  96. package/examples/v2_mariadb_auth/package.json +27 -0
  97. package/examples/v2_mariadb_auth/routes.json +37 -0
  98. package/examples/v2_no_auth/README.md +75 -0
  99. package/examples/v2_no_auth/app.js +72 -0
  100. package/examples/v2_no_auth/controllers/healthController.js +14 -0
  101. package/examples/v2_no_auth/controllers/mainController.js +19 -0
  102. package/examples/v2_no_auth/controllers/productController.js +31 -0
  103. package/examples/v2_no_auth/controllers/publicController.js +16 -0
  104. package/examples/v2_no_auth/package.json +22 -0
  105. package/examples/v2_no_auth/routes.json +37 -0
  106. package/examples/v2_oauth/README.md +70 -0
  107. package/examples/v2_oauth/app.js +90 -0
  108. package/examples/v2_oauth/controllers/mainController.js +45 -0
  109. package/examples/v2_oauth/controllers/oauthController.js +247 -0
  110. package/examples/v2_oauth/controllers/protectedController.js +13 -0
  111. package/examples/v2_oauth/controllers/userController.js +17 -0
  112. package/examples/v2_oauth/package.json +26 -0
  113. package/examples/v2_oauth/routes.json +44 -0
  114. package/examples/v2_openapi/README.md +77 -0
  115. package/examples/v2_openapi/app.js +222 -0
  116. package/examples/v2_openapi/controllers/authController.js +52 -0
  117. package/examples/v2_openapi/controllers/mainController.js +26 -0
  118. package/examples/v2_openapi/controllers/productController.js +17 -0
  119. package/examples/v2_openapi/controllers/userController.js +27 -0
  120. package/examples/v2_openapi/package.json +26 -0
  121. package/examples/v2_openapi/routes.json +37 -0
  122. package/generate_token.js +10 -0
  123. package/index.js +85 -0
  124. package/jerk.jpg +0 -0
  125. package/lib/core/handler.js +86 -0
  126. package/lib/core/hooks.js +224 -0
  127. package/lib/core/router.js +204 -0
  128. package/lib/core/securityEnhancedServer.js +752 -0
  129. package/lib/core/server.js +369 -0
  130. package/lib/loader/controllerLoader.js +175 -0
  131. package/lib/loader/routeLoader.js +341 -0
  132. package/lib/middleware/auditLogger.js +208 -0
  133. package/lib/middleware/authenticator.js +565 -0
  134. package/lib/middleware/compressor.js +218 -0
  135. package/lib/middleware/cors.js +135 -0
  136. package/lib/middleware/firewall.js +443 -0
  137. package/lib/middleware/rateLimiter.js +210 -0
  138. package/lib/middleware/session.js +301 -0
  139. package/lib/middleware/validator.js +193 -0
  140. package/lib/mvc/controllerBase.js +207 -0
  141. package/lib/mvc/viewEngine.js +752 -0
  142. package/lib/utils/configParser.js +223 -0
  143. package/lib/utils/logger.js +145 -0
  144. package/lib/utils/mariadbTokenAdapter.js +226 -0
  145. package/lib/utils/openapiGenerator.js +140 -0
  146. package/lib/utils/sqliteTokenAdapter.js +224 -0
  147. package/lib/utils/tokenManager.js +254 -0
  148. package/package.json +47 -0
  149. package/v2examplle/v2_json_auth/README.md +83 -0
  150. package/v2examplle/v2_json_auth/app.js +72 -0
  151. package/v2examplle/v2_json_auth/controllers/authController.js +67 -0
  152. package/v2examplle/v2_json_auth/controllers/mainController.js +16 -0
  153. package/v2examplle/v2_json_auth/controllers/protectedController.js +12 -0
  154. package/v2examplle/v2_json_auth/controllers/tokenController.js +28 -0
  155. package/v2examplle/v2_json_auth/controllers/userController.js +15 -0
  156. package/v2examplle/v2_json_auth/package.json +26 -0
  157. package/v2examplle/v2_json_auth/routes.json +37 -0
  158. package/v2examplle/v2_json_auth/tokens.json +20 -0
  159. package/v2examplle/v2_mariadb_auth/README.md +94 -0
  160. package/v2examplle/v2_mariadb_auth/app.js +81 -0
  161. package/v2examplle/v2_mariadb_auth/controllers/authController.js +95 -0
  162. package/v2examplle/v2_mariadb_auth/controllers/mainController.js +31 -0
  163. package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +12 -0
  164. package/v2examplle/v2_mariadb_auth/controllers/userController.js +17 -0
  165. package/v2examplle/v2_mariadb_auth/package.json +27 -0
  166. package/v2examplle/v2_mariadb_auth/routes.json +37 -0
  167. package/v2examplle/v2_sqlite_auth/README.md +72 -0
  168. package/v2examplle/v2_sqlite_auth/app.js +74 -0
  169. package/v2examplle/v2_sqlite_auth/app_fixed.js +74 -0
  170. package/v2examplle/v2_sqlite_auth/controllers/authController.js +64 -0
  171. package/v2examplle/v2_sqlite_auth/controllers/mainController.js +24 -0
  172. package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +12 -0
  173. package/v2examplle/v2_sqlite_auth/controllers/userController.js +16 -0
  174. package/v2examplle/v2_sqlite_auth/package.json +27 -0
  175. package/v2examplle/v2_sqlite_auth/routes.json +30 -0
  176. package/v2examplle/v2_sqlite_auth/test_api.sh +47 -0
  177. 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;