jerkjs 2.1.1 → 2.1.2

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 (170) hide show
  1. package/CHANGELOG.md +3 -2
  2. package/README.md +1 -1
  3. package/examples.arj +0 -0
  4. package/index.js +1 -1
  5. package/lib/middleware/compressor.js +34 -18
  6. package/package.json +1 -1
  7. package/standard/CompressionTestController.js +38 -0
  8. package/standard/HealthController.js +16 -0
  9. package/standard/HomeController.js +12 -0
  10. package/standard/ProductController.js +18 -0
  11. package/standard/README.md +47 -0
  12. package/standard/UserController.js +23 -0
  13. package/standard/package.json +22 -0
  14. package/standard/routes.json +58 -0
  15. package/standard/server.js +140 -0
  16. package/cookies.txt +0 -5
  17. package/examples/advanced/controllers/productController.js +0 -64
  18. package/examples/advanced/controllers/userController.js +0 -85
  19. package/examples/advanced/routes.json +0 -51
  20. package/examples/advanced_example.js +0 -93
  21. package/examples/basic/controllers/userController.js +0 -85
  22. package/examples/basic_example.js +0 -72
  23. package/examples/frontend/README.md +0 -71
  24. package/examples/frontend/app.js +0 -71
  25. package/examples/frontend/controllers/apiController.js +0 -39
  26. package/examples/frontend/controllers/authController.js +0 -220
  27. package/examples/frontend/controllers/formController.js +0 -47
  28. package/examples/frontend/controllers/messageController.js +0 -96
  29. package/examples/frontend/controllers/pageController.js +0 -178
  30. package/examples/frontend/controllers/staticController.js +0 -167
  31. package/examples/frontend/routes.json +0 -90
  32. package/examples/hooks/app.js +0 -136
  33. package/examples/hooks/controllers/authController.js +0 -54
  34. package/examples/hooks/controllers/mainController.js +0 -41
  35. package/examples/hooks/controllers/productController.js +0 -39
  36. package/examples/hooks/controllers/userController.js +0 -69
  37. package/examples/hooks/routes.json +0 -51
  38. package/examples/hooks/views/home.html +0 -50
  39. package/examples/mvc_example/app.js +0 -138
  40. package/examples/mvc_example/views/home/index.html +0 -26
  41. package/examples/mvc_example/views/home/simple.html +0 -3
  42. package/examples/mvc_example/views/layout.html +0 -23
  43. package/examples/mvc_example/views/test.html +0 -3
  44. package/examples/mvc_example/views/user/invalid.html +0 -6
  45. package/examples/mvc_example/views/user/list.html +0 -36
  46. package/examples/mvc_example/views/user/notfound.html +0 -6
  47. package/examples/mvc_example/views/user/profile.html +0 -11
  48. package/examples/mvc_routes_example/app.js +0 -34
  49. package/examples/mvc_routes_example/controllers/mainController.js +0 -27
  50. package/examples/mvc_routes_example/controllers/productController.js +0 -47
  51. package/examples/mvc_routes_example/controllers/userController.js +0 -76
  52. package/examples/mvc_routes_example/routes.json +0 -30
  53. package/examples/mvc_routes_example/views/layout.html +0 -31
  54. package/examples/mvc_routes_example/views/main/index.html +0 -11
  55. package/examples/mvc_routes_example/views/product/catalog.html +0 -24
  56. package/examples/mvc_routes_example/views/user/invalid.html +0 -6
  57. package/examples/mvc_routes_example/views/user/list.html +0 -40
  58. package/examples/mvc_routes_example/views/user/notfound.html +0 -6
  59. package/examples/mvc_routes_example/views/user/profile.html +0 -18
  60. package/examples/mvc_welcome/README.md +0 -34
  61. package/examples/mvc_welcome/app.js +0 -50
  62. package/examples/mvc_welcome/controllers/welcomeController.js +0 -41
  63. package/examples/mvc_welcome/package.json +0 -26
  64. package/examples/mvc_welcome/views/home/welcome.html +0 -82
  65. package/examples/performance_demo/app.js +0 -172
  66. package/examples/performance_demo_with_hooks/README.md +0 -52
  67. package/examples/performance_demo_with_hooks/app.js +0 -290
  68. package/examples/public/README.md +0 -92
  69. package/examples/public/app.js +0 -72
  70. package/examples/public/controllers/healthController.js +0 -20
  71. package/examples/public/controllers/mainController.js +0 -22
  72. package/examples/public/controllers/userController.js +0 -139
  73. package/examples/public/routes.json +0 -51
  74. package/examples/v2/README.md +0 -72
  75. package/examples/v2/app.js +0 -74
  76. package/examples/v2/app_fixed.js +0 -74
  77. package/examples/v2/controllers/authController.js +0 -64
  78. package/examples/v2/controllers/mainController.js +0 -24
  79. package/examples/v2/controllers/protectedController.js +0 -12
  80. package/examples/v2/controllers/userController.js +0 -16
  81. package/examples/v2/package.json +0 -27
  82. package/examples/v2/routes.json +0 -30
  83. package/examples/v2/test_api.sh +0 -47
  84. package/examples/v2/tokens_example.sqlite +0 -0
  85. package/examples/v2.1_firewall_demo/README.md +0 -113
  86. package/examples/v2.1_firewall_demo/app.js +0 -182
  87. package/examples/v2.1_firewall_demo/package.json +0 -27
  88. package/examples/v2.1_hooks_demo/README.md +0 -85
  89. package/examples/v2.1_hooks_demo/app.js +0 -101
  90. package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
  91. package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
  92. package/examples/v2.1_hooks_demo/package.json +0 -27
  93. package/examples/v2.1_hooks_demo/routes.json +0 -16
  94. package/examples/v2.1_openapi_demo/README.md +0 -82
  95. package/examples/v2.1_openapi_demo/app.js +0 -296
  96. package/examples/v2.1_openapi_demo/package.json +0 -26
  97. package/examples/v2_cors/README.md +0 -82
  98. package/examples/v2_cors/app.js +0 -108
  99. package/examples/v2_cors/package.json +0 -23
  100. package/examples/v2_json_auth/README.md +0 -83
  101. package/examples/v2_json_auth/app.js +0 -72
  102. package/examples/v2_json_auth/controllers/authController.js +0 -67
  103. package/examples/v2_json_auth/controllers/mainController.js +0 -16
  104. package/examples/v2_json_auth/controllers/protectedController.js +0 -12
  105. package/examples/v2_json_auth/controllers/tokenController.js +0 -28
  106. package/examples/v2_json_auth/controllers/userController.js +0 -15
  107. package/examples/v2_json_auth/package.json +0 -26
  108. package/examples/v2_json_auth/routes.json +0 -37
  109. package/examples/v2_json_auth/tokens.json +0 -20
  110. package/examples/v2_mariadb_auth/README.md +0 -94
  111. package/examples/v2_mariadb_auth/app.js +0 -81
  112. package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
  113. package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
  114. package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
  115. package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
  116. package/examples/v2_mariadb_auth/package.json +0 -27
  117. package/examples/v2_mariadb_auth/routes.json +0 -37
  118. package/examples/v2_no_auth/README.md +0 -75
  119. package/examples/v2_no_auth/app.js +0 -72
  120. package/examples/v2_no_auth/controllers/healthController.js +0 -14
  121. package/examples/v2_no_auth/controllers/mainController.js +0 -19
  122. package/examples/v2_no_auth/controllers/productController.js +0 -31
  123. package/examples/v2_no_auth/controllers/publicController.js +0 -16
  124. package/examples/v2_no_auth/package.json +0 -22
  125. package/examples/v2_no_auth/routes.json +0 -37
  126. package/examples/v2_oauth/README.md +0 -70
  127. package/examples/v2_oauth/app.js +0 -90
  128. package/examples/v2_oauth/controllers/mainController.js +0 -45
  129. package/examples/v2_oauth/controllers/oauthController.js +0 -247
  130. package/examples/v2_oauth/controllers/protectedController.js +0 -13
  131. package/examples/v2_oauth/controllers/userController.js +0 -17
  132. package/examples/v2_oauth/package.json +0 -26
  133. package/examples/v2_oauth/routes.json +0 -44
  134. package/examples/v2_openapi/README.md +0 -77
  135. package/examples/v2_openapi/app.js +0 -222
  136. package/examples/v2_openapi/controllers/authController.js +0 -52
  137. package/examples/v2_openapi/controllers/mainController.js +0 -26
  138. package/examples/v2_openapi/controllers/productController.js +0 -17
  139. package/examples/v2_openapi/controllers/userController.js +0 -27
  140. package/examples/v2_openapi/package.json +0 -26
  141. package/examples/v2_openapi/routes.json +0 -37
  142. package/v2examplle/v2_json_auth/README.md +0 -83
  143. package/v2examplle/v2_json_auth/app.js +0 -72
  144. package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
  145. package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
  146. package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
  147. package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
  148. package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
  149. package/v2examplle/v2_json_auth/package.json +0 -26
  150. package/v2examplle/v2_json_auth/routes.json +0 -37
  151. package/v2examplle/v2_json_auth/tokens.json +0 -20
  152. package/v2examplle/v2_mariadb_auth/README.md +0 -94
  153. package/v2examplle/v2_mariadb_auth/app.js +0 -81
  154. package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
  155. package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
  156. package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
  157. package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
  158. package/v2examplle/v2_mariadb_auth/package.json +0 -27
  159. package/v2examplle/v2_mariadb_auth/routes.json +0 -37
  160. package/v2examplle/v2_sqlite_auth/README.md +0 -72
  161. package/v2examplle/v2_sqlite_auth/app.js +0 -74
  162. package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
  163. package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
  164. package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
  165. package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
  166. package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
  167. package/v2examplle/v2_sqlite_auth/package.json +0 -27
  168. package/v2examplle/v2_sqlite_auth/routes.json +0 -30
  169. package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
  170. package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
@@ -1,52 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { TokenManager } = require('../../../index.js');
3
-
4
- // TokenManager para este controlador
5
- const tokenManager = new TokenManager({
6
- storage: 'memory'
7
- });
8
-
9
- const authController = {
10
- login: async (req, res) => {
11
- try {
12
- const { username, password } = req.body;
13
-
14
- // Validación simple de credenciales (esto debería ser más robusto en producción)
15
- if (!username || !password) {
16
- res.writeHead(400, { 'Content-Type': 'application/json' });
17
- res.end(JSON.stringify({ error: 'Nombre de usuario y contraseña requeridos' }));
18
- return;
19
- }
20
-
21
- // Simulación de autenticación (en una aplicación real, esto verificaría contra una base de datos)
22
- if (username === 'admin' && password === 'password') {
23
- // Generar un token JWT
24
- const payload = {
25
- userId: 1,
26
- username: username,
27
- role: 'admin'
28
- };
29
-
30
- // Secret para firmar el token (en producción, debería estar en variables de entorno)
31
- const secret = 'super-secret-key-for-openapi-example';
32
- const token = jwt.sign(payload, secret, { expiresIn: '1h' });
33
-
34
- res.writeHead(200, { 'Content-Type': 'application/json' });
35
- res.end(JSON.stringify({
36
- message: 'Inicio de sesión exitoso',
37
- token: token,
38
- user: payload
39
- }));
40
- } else {
41
- res.writeHead(401, { 'Content-Type': 'application/json' });
42
- res.end(JSON.stringify({ error: 'Credenciales inválidas' }));
43
- }
44
- } catch (error) {
45
- console.error('Error en login:', error);
46
- res.writeHead(500, { 'Content-Type': 'application/json' });
47
- res.end(JSON.stringify({ error: 'Error interno del servidor' }));
48
- }
49
- }
50
- };
51
-
52
- module.exports = authController;
@@ -1,26 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { TokenManager } = require('../../../index.js');
3
-
4
- // TokenManager para este controlador
5
- const tokenManager = new TokenManager({
6
- storage: 'memory'
7
- });
8
-
9
- const mainController = {
10
- home: (req, res) => {
11
- res.writeHead(200, { 'Content-Type': 'application/json' });
12
- res.end(JSON.stringify({
13
- message: 'Bienvenido a la API de ejemplo con funcionalidad OpenAPI',
14
- endpoints: {
15
- 'POST /login': 'Iniciar sesión y obtener token',
16
- 'GET /users': 'Obtener lista de usuarios (requiere token)',
17
- 'GET /products': 'Obtener lista de productos (requiere token)',
18
- 'GET /profile': 'Obtener perfil de usuario (requiere token)',
19
- 'GET /docs': 'Documentación interactiva OpenAPI/Swagger',
20
- 'GET /openapi.json': 'Especificación OpenAPI'
21
- }
22
- }));
23
- }
24
- };
25
-
26
- module.exports = mainController;
@@ -1,17 +0,0 @@
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
- getProducts: (req, res) => {
12
- res.writeHead(200, { 'Content-Type': 'application/json' });
13
- res.end(JSON.stringify(products));
14
- }
15
- };
16
-
17
- module.exports = productController;
@@ -1,27 +0,0 @@
1
- // Datos de ejemplo de usuarios
2
- const users = [
3
- { id: 1, name: 'John Doe', email: 'john@example.com', role: 'admin' },
4
- { id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'user' },
5
- { id: 3, name: 'Robert Johnson', email: 'robert@example.com', role: 'user' }
6
- ];
7
-
8
- const userController = {
9
- getUsers: (req, res) => {
10
- res.writeHead(200, { 'Content-Type': 'application/json' });
11
- res.end(JSON.stringify(users));
12
- },
13
-
14
- getProfile: (req, res) => {
15
- res.writeHead(200, { 'Content-Type': 'application/json' });
16
- res.end(JSON.stringify({
17
- profile: {
18
- id: req.user.userId,
19
- username: req.user.username || 'Usuario',
20
- role: req.user.role || 'guest'
21
- },
22
- message: 'Perfil de usuario obtenido exitosamente'
23
- }));
24
- }
25
- };
26
-
27
- module.exports = userController;
@@ -1,26 +0,0 @@
1
- {
2
- "name": "jerk-openapi-example",
3
- "version": "1.0.0",
4
- "description": "Ejemplo de API con funcionalidad OpenAPI usando el Framework JERK",
5
- "main": "app.js",
6
- "scripts": {
7
- "start": "node app.js",
8
- "dev": "nodemon app.js"
9
- },
10
- "keywords": [
11
- "api",
12
- "sdk",
13
- "openapi",
14
- "swagger",
15
- "documentation",
16
- "framework"
17
- ],
18
- "author": "JERK Framework",
19
- "license": "MIT",
20
- "dependencies": {
21
- "jsonwebtoken": "^9.0.0"
22
- },
23
- "devDependencies": {
24
- "nodemon": "^3.0.0"
25
- }
26
- }
@@ -1,37 +0,0 @@
1
- [
2
- {
3
- "path": "/",
4
- "method": "GET",
5
- "controller": "./controllers/mainController.js",
6
- "handler": "home",
7
- "auth": "none"
8
- },
9
- {
10
- "path": "/login",
11
- "method": "POST",
12
- "controller": "./controllers/authController.js",
13
- "handler": "login",
14
- "auth": "none"
15
- },
16
- {
17
- "path": "/users",
18
- "method": "GET",
19
- "controller": "./controllers/userController.js",
20
- "handler": "getUsers",
21
- "auth": "jwt-openapi"
22
- },
23
- {
24
- "path": "/products",
25
- "method": "GET",
26
- "controller": "./controllers/productController.js",
27
- "handler": "getProducts",
28
- "auth": "jwt-openapi"
29
- },
30
- {
31
- "path": "/profile",
32
- "method": "GET",
33
- "controller": "./controllers/userController.js",
34
- "handler": "getProfile",
35
- "auth": "jwt-openapi"
36
- }
37
- ]
@@ -1,83 +0,0 @@
1
- # Ejemplo API con Autenticación JSON
2
-
3
- Este ejemplo demuestra cómo crear una API con autenticación basada en tokens estáticos almacenados en un archivo JSON utilizando el Framework JERK.
4
-
5
- ## Características
6
-
7
- - Autenticación JWT con tokens gestionados a través de almacenamiento JSON
8
- - Rutas protegidas y públicas
9
- - Sistema de login para obtener tokens
10
- - Controladores organizados por funcionalidad
11
- - Tokens almacenados en un archivo JSON local
12
-
13
- ## Configuración
14
-
15
- 1. Asegúrate de tener instaladas las dependencias del framework JERK
16
- 2. El archivo de tokens `tokens.json` se creará automáticamente al iniciar la aplicación
17
-
18
- ## Uso
19
-
20
- 1. Inicia el servidor:
21
- ```bash
22
- node app.js
23
- ```
24
-
25
- 2. El servidor escuchará en `http://localhost:8091`
26
-
27
- ## Endpoints
28
-
29
- - `GET /` - Página de inicio (público)
30
- - `POST /login` - Iniciar sesión y obtener token (público)
31
- - `GET /protected` - Contenido protegido (requiere token)
32
- - `GET /profile` - Perfil de usuario (requiere token)
33
- - `GET /tokens` - Ver tokens almacenados (requiere token)
34
-
35
- ## Ejemplo de uso
36
-
37
- 1. Iniciar sesión:
38
- ```bash
39
- curl -X POST http://localhost:8091/login \
40
- -H "Content-Type: application/json" \
41
- -d '{"username": "admin", "password": "password"}'
42
- ```
43
-
44
- 2. Acceder a contenido protegido:
45
- ```bash
46
- curl -X GET http://localhost:8091/protected \
47
- -H "Authorization: Bearer TU_TOKEN_AQUI"
48
- ```
49
-
50
- 3. Ver perfil de usuario:
51
- ```bash
52
- curl -X GET http://localhost:8091/profile \
53
- -H "Authorization: Bearer TU_TOKEN_AQUI"
54
- ```
55
-
56
- 4. Ver tokens almacenados:
57
- ```bash
58
- curl -X GET http://localhost:8091/tokens \
59
- -H "Authorization: Bearer TU_TOKEN_AQUI"
60
- ```
61
-
62
- ## Estructura del proyecto
63
-
64
- ```
65
- examples/v2_json_auth/
66
- ├── app.js # Punto de entrada de la aplicación
67
- ├── routes.json # Definición de rutas
68
- ├── controllers/ # Controladores de las rutas
69
- │ ├── mainController.js
70
- │ ├── authController.js
71
- │ ├── protectedController.js
72
- │ ├── userController.js
73
- │ └── tokenController.js
74
- ├── tokens.json # Archivo de almacenamiento de tokens (generado automáticamente)
75
- └── README.md
76
- ```
77
-
78
- ## Seguridad
79
-
80
- - Los tokens se gestionan a través del sistema de TokenManager del framework
81
- - Los tokens expiran después de 1 hora
82
- - Las rutas protegidas requieren un token válido en el header Authorization
83
- - El archivo de tokens se almacena localmente en formato JSON
@@ -1,72 +0,0 @@
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: 8091,
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 con almacenamiento en JSON
21
- const tokenManager = new TokenManager({
22
- storage: 'json',
23
- tokenFile: './tokens.json'
24
- });
25
-
26
- // Crear instancia del autenticador
27
- const authenticator = new Authenticator({ logger });
28
-
29
- // Registrar estrategia de autenticación JWT que utiliza el TokenManager con almacenamiento JSON
30
- authenticator.use('jwt-json', async (req, options = {}) => {
31
- const authHeader = req.headers.authorization;
32
- const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
33
-
34
- if (!token) {
35
- return false;
36
- }
37
-
38
- // Validar el token usando el TokenManager
39
- const secret = 'super-secret-key-for-json-example';
40
- const decoded = tokenManager.validateToken(token, secret);
41
-
42
- if (decoded) {
43
- // Verificar si el token está almacenado en el archivo JSON (opcional, dependiendo del enfoque)
44
- // En este caso, simplemente verificamos que el token sea válido
45
- req.user = decoded;
46
- return true;
47
- }
48
-
49
- return false;
50
- });
51
-
52
- // Agregar el autenticador al servidor para que pueda ser usado por el RouteLoader
53
- server.authenticator = authenticator;
54
-
55
- // Cargar rutas desde archivo JSON
56
- const routeLoader = new RouteLoader();
57
- await routeLoader.loadRoutes(server, './routes.json');
58
-
59
- // Iniciar el servidor
60
- server.start();
61
-
62
- logger.info('Servidor iniciado en http://localhost:8091');
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 };
@@ -1,67 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { TokenManager } = require('../../../index.js');
3
-
4
- // TokenManager para este controlador
5
- const tokenManager = new TokenManager({
6
- storage: 'json',
7
- tokenFile: './tokens.json'
8
- });
9
-
10
- const authController = {
11
- login: async (req, res) => {
12
- try {
13
- const { username, password } = req.body;
14
-
15
- // Validación simple de credenciales (esto debería ser más robusto en producción)
16
- if (!username || !password) {
17
- res.writeHead(400, { 'Content-Type': 'application/json' });
18
- res.end(JSON.stringify({ error: 'Nombre de usuario y contraseña requeridos' }));
19
- return;
20
- }
21
-
22
- // Simulación de autenticación (en una aplicación real, esto verificaría contra una base de datos)
23
- if (username === 'admin' && password === 'password') {
24
- // Generar un token JWT
25
- const payload = {
26
- userId: 1,
27
- username: username,
28
- role: 'admin'
29
- };
30
-
31
- // Secret para firmar el token (en producción, debería estar en variables de entorno)
32
- const secret = 'super-secret-key-for-json-example';
33
- const token = jwt.sign(payload, secret, { expiresIn: '1h' });
34
-
35
- // En este ejemplo con almacenamiento JSON, no almacenamos el token en sí
36
- // pero podríamos registrar información sobre él si es necesario
37
- // Alternativamente, podríamos usar el TokenManager para generar un par de tokens
38
- const tokenPair = tokenManager.generateTokenPair(
39
- { userId: 1, username: username, role: 'admin' },
40
- {
41
- jwtSecret: secret,
42
- refreshSecret: 'refresh-' + secret,
43
- accessExpiresIn: '15m',
44
- refreshExpiresIn: '7d'
45
- }
46
- );
47
-
48
- // Usamos el token de acceso
49
- res.writeHead(200, { 'Content-Type': 'application/json' });
50
- res.end(JSON.stringify({
51
- message: 'Inicio de sesión exitoso',
52
- token: tokenPair.accessToken,
53
- user: payload
54
- }));
55
- } else {
56
- res.writeHead(401, { 'Content-Type': 'application/json' });
57
- res.end(JSON.stringify({ error: 'Credenciales inválidas' }));
58
- }
59
- } catch (error) {
60
- console.error('Error en login:', error);
61
- res.writeHead(500, { 'Content-Type': 'application/json' });
62
- res.end(JSON.stringify({ error: 'Error interno del servidor' }));
63
- }
64
- }
65
- };
66
-
67
- module.exports = authController;
@@ -1,16 +0,0 @@
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 de ejemplo con autenticación JSON',
6
- endpoints: {
7
- 'POST /login': 'Iniciar sesión y obtener token',
8
- 'GET /protected': 'Contenido protegido (requiere token)',
9
- 'GET /profile': 'Perfil de usuario (requiere token)',
10
- 'GET /tokens': 'Ver tokens almacenados (requiere token)'
11
- }
12
- }));
13
- }
14
- };
15
-
16
- module.exports = mainController;
@@ -1,12 +0,0 @@
1
- const protectedController = {
2
- getProtectedData: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- message: 'Datos protegidos accesados exitosamente',
6
- user: req.user,
7
- timestamp: new Date().toISOString()
8
- }));
9
- }
10
- };
11
-
12
- module.exports = protectedController;
@@ -1,28 +0,0 @@
1
- const { TokenManager } = require('../../../index.js');
2
-
3
- // TokenManager para este controlador
4
- const tokenManager = new TokenManager({
5
- storage: 'json',
6
- tokenFile: './tokens.json'
7
- });
8
-
9
- const tokenController = {
10
- getTokens: (req, res) => {
11
- try {
12
- // Obtener todos los tokens almacenados
13
- const tokens = tokenManager.getAllTokens ? tokenManager.getAllTokens() : 'Método no disponible en esta implementación';
14
-
15
- res.writeHead(200, { 'Content-Type': 'application/json' });
16
- res.end(JSON.stringify({
17
- message: 'Tokens almacenados',
18
- tokens: tokens || 'No se pudo obtener la lista de tokens'
19
- }));
20
- } catch (error) {
21
- console.error('Error obteniendo tokens:', error);
22
- res.writeHead(500, { 'Content-Type': 'application/json' });
23
- res.end(JSON.stringify({ error: 'Error obteniendo tokens' }));
24
- }
25
- }
26
- };
27
-
28
- module.exports = tokenController;
@@ -1,15 +0,0 @@
1
- const userController = {
2
- getProfile: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- profile: {
6
- id: req.user.userId,
7
- username: req.user.username || 'Usuario',
8
- role: req.user.role || 'guest'
9
- },
10
- message: 'Perfil de usuario obtenido exitosamente'
11
- }));
12
- }
13
- };
14
-
15
- module.exports = userController;
@@ -1,26 +0,0 @@
1
- {
2
- "name": "jerk-json-auth-example",
3
- "version": "1.0.0",
4
- "description": "Ejemplo de API con autenticación JSON usando el Framework JERK",
5
- "main": "app.js",
6
- "scripts": {
7
- "start": "node app.js",
8
- "dev": "nodemon app.js"
9
- },
10
- "keywords": [
11
- "api",
12
- "sdk",
13
- "authentication",
14
- "json",
15
- "jwt",
16
- "framework"
17
- ],
18
- "author": "JERK Framework",
19
- "license": "Apache-2.0",
20
- "dependencies": {
21
- "jsonwebtoken": "^9.0.0"
22
- },
23
- "devDependencies": {
24
- "nodemon": "^3.0.0"
25
- }
26
- }
@@ -1,37 +0,0 @@
1
- [
2
- {
3
- "path": "/",
4
- "method": "GET",
5
- "controller": "./controllers/mainController.js",
6
- "handler": "home",
7
- "auth": "none"
8
- },
9
- {
10
- "path": "/login",
11
- "method": "POST",
12
- "controller": "./controllers/authController.js",
13
- "handler": "login",
14
- "auth": "none"
15
- },
16
- {
17
- "path": "/protected",
18
- "method": "GET",
19
- "controller": "./controllers/protectedController.js",
20
- "handler": "getProtectedData",
21
- "auth": "jwt-json"
22
- },
23
- {
24
- "path": "/profile",
25
- "method": "GET",
26
- "controller": "./controllers/userController.js",
27
- "handler": "getProfile",
28
- "auth": "jwt-json"
29
- },
30
- {
31
- "path": "/tokens",
32
- "method": "GET",
33
- "controller": "./controllers/tokenController.js",
34
- "handler": "getTokens",
35
- "auth": "jwt-json"
36
- }
37
- ]
@@ -1,20 +0,0 @@
1
- {
2
- "example_token": {
3
- "userId": 0,
4
- "createdAt": "2026-01-14T00:00:00.000Z",
5
- "expiresAt": "2026-01-15T00:00:00.000Z",
6
- "revoked": false
7
- },
8
- "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsInVzZXJuYW1lIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJ0b2tlblR5cGUiOiJyZWZyZXNoIiwiaWF0IjoxNzY4NDMzODc2LCJleHAiOjE3NjkwMzg2NzZ9.50INL6kmOd9A2mQiBRBlHaXHk31Tw7SgQMH_uRh6NVo": {
9
- "userId": 1,
10
- "createdAt": "2026-01-14T23:37:56.407Z",
11
- "expiresAt": "2026-01-21T23:37:56.407Z",
12
- "revoked": false
13
- },
14
- "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsInVzZXJuYW1lIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJ0b2tlblR5cGUiOiJyZWZyZXNoIiwiaWF0IjoxNzY4NDM4NzU4LCJleHAiOjE3NjkwNDM1NTh9.WoMURKAizVPkMM0-lqtl1-mP0L8OMM6INeG5Bv79ixU": {
15
- "userId": 1,
16
- "createdAt": "2026-01-15T00:59:18.846Z",
17
- "expiresAt": "2026-01-22T00:59:18.846Z",
18
- "revoked": false
19
- }
20
- }
@@ -1,94 +0,0 @@
1
- # Ejemplo API con Autenticación MariaDB
2
-
3
- Este ejemplo demuestra cómo crear una API con autenticación basada en tokens almacenados en MariaDB utilizando el Framework JERK.
4
-
5
- ## Características
6
-
7
- - Autenticación JWT con tokens almacenados en MariaDB
8
- - Rutas protegidas y públicas
9
- - Sistema de login/logout para obtener y revocar tokens
10
- - Controladores organizados por funcionalidad
11
- - Revocación de tokens en la base de datos
12
-
13
- ## Configuración
14
-
15
- 1. Asegúrate de tener instaladas las dependencias del framework JERK
16
- 2. Instala mariadb si aún no está instalado: `npm install mariadb`
17
- 3. Asegúrate de tener MariaDB instalado y en ejecución
18
- 4. Crea la base de datos `token_db` en MariaDB
19
-
20
- ## Preparación de la base de datos
21
-
22
- Antes de ejecutar la aplicación, asegúrate de tener MariaDB en ejecución y crea la base de datos:
23
-
24
- ```sql
25
- CREATE DATABASE IF NOT EXISTS token_db;
26
- USE token_db;
27
- ```
28
-
29
- La tabla de tokens se creará automáticamente al iniciar la aplicación.
30
-
31
- ## Uso
32
-
33
- 1. Inicia el servidor:
34
- ```bash
35
- node app.js
36
- ```
37
-
38
- 2. El servidor escuchará en `http://localhost:8090`
39
-
40
- ## Endpoints
41
-
42
- - `GET /` - Página de inicio (público)
43
- - `POST /login` - Iniciar sesión y obtener token (público)
44
- - `GET /protected` - Contenido protegido (requiere token)
45
- - `GET /profile` - Perfil de usuario (requiere token)
46
- - `POST /logout` - Cerrar sesión y revocar token (requiere token)
47
-
48
- ## Ejemplo de uso
49
-
50
- 1. Iniciar sesión:
51
- ```bash
52
- curl -X POST http://localhost:8090/login \
53
- -H "Content-Type: application/json" \
54
- -d '{"username": "admin", "password": "password"}'
55
- ```
56
-
57
- 2. Acceder a contenido protegido:
58
- ```bash
59
- curl -X GET http://localhost:8090/protected \
60
- -H "Authorization: Bearer TU_TOKEN_AQUI"
61
- ```
62
-
63
- 3. Ver perfil de usuario:
64
- ```bash
65
- curl -X GET http://localhost:8090/profile \
66
- -H "Authorization: Bearer TU_TOKEN_AQUI"
67
- ```
68
-
69
- 4. Cerrar sesión y revocar token:
70
- ```bash
71
- curl -X POST http://localhost:8090/logout \
72
- -H "Authorization: Bearer TU_TOKEN_AQUI"
73
- ```
74
-
75
- ## Estructura del proyecto
76
-
77
- ```
78
- examples/v2_mariadb_auth/
79
- ├── app.js # Punto de entrada de la aplicación
80
- ├── routes.json # Definición de rutas
81
- ├── controllers/ # Controladores de las rutas
82
- │ ├── mainController.js
83
- │ ├── authController.js
84
- │ ├── protectedController.js
85
- │ └── userController.js
86
- └── README.md
87
- ```
88
-
89
- ## Seguridad
90
-
91
- - Los tokens se almacenan en una base de datos MariaDB
92
- - Los tokens expiran después de 1 hora
93
- - Las rutas protegidas requieren un token válido en el header Authorization
94
- - Los tokens pueden ser revocados mediante el endpoint de logout