jerkjs 2.1.0 → 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.
- package/CHANGELOG.md +3 -2
- package/README.md +1 -1
- package/examples.arj +0 -0
- package/index.js +1 -1
- package/lib/middleware/compressor.js +34 -18
- package/package.json +1 -1
- package/standard/CompressionTestController.js +38 -0
- package/standard/HealthController.js +16 -0
- package/standard/HomeController.js +12 -0
- package/standard/ProductController.js +18 -0
- package/standard/README.md +47 -0
- package/standard/UserController.js +23 -0
- package/standard/package.json +22 -0
- package/standard/routes.json +58 -0
- package/standard/server.js +140 -0
- package/cookies.txt +0 -5
- package/examples/advanced/controllers/productController.js +0 -64
- package/examples/advanced/controllers/userController.js +0 -85
- package/examples/advanced/routes.json +0 -51
- package/examples/advanced_example.js +0 -93
- package/examples/basic/controllers/userController.js +0 -85
- package/examples/basic_example.js +0 -72
- package/examples/frontend/README.md +0 -71
- package/examples/frontend/app.js +0 -71
- package/examples/frontend/controllers/apiController.js +0 -39
- package/examples/frontend/controllers/authController.js +0 -220
- package/examples/frontend/controllers/formController.js +0 -47
- package/examples/frontend/controllers/messageController.js +0 -96
- package/examples/frontend/controllers/pageController.js +0 -178
- package/examples/frontend/controllers/staticController.js +0 -167
- package/examples/frontend/routes.json +0 -90
- package/examples/hooks/app.js +0 -136
- package/examples/hooks/controllers/authController.js +0 -54
- package/examples/hooks/controllers/mainController.js +0 -41
- package/examples/hooks/controllers/productController.js +0 -39
- package/examples/hooks/controllers/userController.js +0 -69
- package/examples/hooks/routes.json +0 -51
- package/examples/hooks/views/home.html +0 -50
- package/examples/mvc_example/app.js +0 -138
- package/examples/mvc_example/views/home/index.html +0 -26
- package/examples/mvc_example/views/home/simple.html +0 -3
- package/examples/mvc_example/views/layout.html +0 -23
- package/examples/mvc_example/views/test.html +0 -3
- package/examples/mvc_example/views/user/invalid.html +0 -6
- package/examples/mvc_example/views/user/list.html +0 -36
- package/examples/mvc_example/views/user/notfound.html +0 -6
- package/examples/mvc_example/views/user/profile.html +0 -11
- package/examples/mvc_routes_example/app.js +0 -34
- package/examples/mvc_routes_example/controllers/mainController.js +0 -27
- package/examples/mvc_routes_example/controllers/productController.js +0 -47
- package/examples/mvc_routes_example/controllers/userController.js +0 -76
- package/examples/mvc_routes_example/routes.json +0 -30
- package/examples/mvc_routes_example/views/layout.html +0 -31
- package/examples/mvc_routes_example/views/main/index.html +0 -11
- package/examples/mvc_routes_example/views/product/catalog.html +0 -24
- package/examples/mvc_routes_example/views/user/invalid.html +0 -6
- package/examples/mvc_routes_example/views/user/list.html +0 -40
- package/examples/mvc_routes_example/views/user/notfound.html +0 -6
- package/examples/mvc_routes_example/views/user/profile.html +0 -18
- package/examples/mvc_welcome/README.md +0 -34
- package/examples/mvc_welcome/app.js +0 -50
- package/examples/mvc_welcome/controllers/welcomeController.js +0 -41
- package/examples/mvc_welcome/package.json +0 -26
- package/examples/mvc_welcome/views/home/welcome.html +0 -82
- package/examples/public/README.md +0 -92
- package/examples/public/app.js +0 -72
- package/examples/public/controllers/healthController.js +0 -20
- package/examples/public/controllers/mainController.js +0 -22
- package/examples/public/controllers/userController.js +0 -139
- package/examples/public/routes.json +0 -51
- package/examples/v2/README.md +0 -72
- package/examples/v2/app.js +0 -74
- package/examples/v2/app_fixed.js +0 -74
- package/examples/v2/controllers/authController.js +0 -64
- package/examples/v2/controllers/mainController.js +0 -24
- package/examples/v2/controllers/protectedController.js +0 -12
- package/examples/v2/controllers/userController.js +0 -16
- package/examples/v2/package.json +0 -27
- package/examples/v2/routes.json +0 -30
- package/examples/v2/test_api.sh +0 -47
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +0 -113
- package/examples/v2.1_firewall_demo/app.js +0 -182
- package/examples/v2.1_firewall_demo/package.json +0 -27
- package/examples/v2.1_hooks_demo/README.md +0 -85
- package/examples/v2.1_hooks_demo/app.js +0 -101
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
- package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
- package/examples/v2.1_hooks_demo/package.json +0 -27
- package/examples/v2.1_hooks_demo/routes.json +0 -16
- package/examples/v2.1_openapi_demo/README.md +0 -82
- package/examples/v2.1_openapi_demo/app.js +0 -296
- package/examples/v2.1_openapi_demo/package.json +0 -26
- package/examples/v2_cors/README.md +0 -82
- package/examples/v2_cors/app.js +0 -108
- package/examples/v2_cors/package.json +0 -23
- package/examples/v2_json_auth/README.md +0 -83
- package/examples/v2_json_auth/app.js +0 -72
- package/examples/v2_json_auth/controllers/authController.js +0 -67
- package/examples/v2_json_auth/controllers/mainController.js +0 -16
- package/examples/v2_json_auth/controllers/protectedController.js +0 -12
- package/examples/v2_json_auth/controllers/tokenController.js +0 -28
- package/examples/v2_json_auth/controllers/userController.js +0 -15
- package/examples/v2_json_auth/package.json +0 -26
- package/examples/v2_json_auth/routes.json +0 -37
- package/examples/v2_json_auth/tokens.json +0 -20
- package/examples/v2_mariadb_auth/README.md +0 -94
- package/examples/v2_mariadb_auth/app.js +0 -81
- package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
- package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
- package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
- package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
- package/examples/v2_mariadb_auth/package.json +0 -27
- package/examples/v2_mariadb_auth/routes.json +0 -37
- package/examples/v2_no_auth/README.md +0 -75
- package/examples/v2_no_auth/app.js +0 -72
- package/examples/v2_no_auth/controllers/healthController.js +0 -14
- package/examples/v2_no_auth/controllers/mainController.js +0 -19
- package/examples/v2_no_auth/controllers/productController.js +0 -31
- package/examples/v2_no_auth/controllers/publicController.js +0 -16
- package/examples/v2_no_auth/package.json +0 -22
- package/examples/v2_no_auth/routes.json +0 -37
- package/examples/v2_oauth/README.md +0 -70
- package/examples/v2_oauth/app.js +0 -90
- package/examples/v2_oauth/controllers/mainController.js +0 -45
- package/examples/v2_oauth/controllers/oauthController.js +0 -247
- package/examples/v2_oauth/controllers/protectedController.js +0 -13
- package/examples/v2_oauth/controllers/userController.js +0 -17
- package/examples/v2_oauth/package.json +0 -26
- package/examples/v2_oauth/routes.json +0 -44
- package/examples/v2_openapi/README.md +0 -77
- package/examples/v2_openapi/app.js +0 -222
- package/examples/v2_openapi/controllers/authController.js +0 -52
- package/examples/v2_openapi/controllers/mainController.js +0 -26
- package/examples/v2_openapi/controllers/productController.js +0 -17
- package/examples/v2_openapi/controllers/userController.js +0 -27
- package/examples/v2_openapi/package.json +0 -26
- package/examples/v2_openapi/routes.json +0 -37
- package/v2examplle/v2_json_auth/README.md +0 -83
- package/v2examplle/v2_json_auth/app.js +0 -72
- package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
- package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
- package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
- package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
- package/v2examplle/v2_json_auth/package.json +0 -26
- package/v2examplle/v2_json_auth/routes.json +0 -37
- package/v2examplle/v2_json_auth/tokens.json +0 -20
- package/v2examplle/v2_mariadb_auth/README.md +0 -94
- package/v2examplle/v2_mariadb_auth/app.js +0 -81
- package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
- package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
- package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
- package/v2examplle/v2_mariadb_auth/package.json +0 -27
- package/v2examplle/v2_mariadb_auth/routes.json +0 -37
- package/v2examplle/v2_sqlite_auth/README.md +0 -72
- package/v2examplle/v2_sqlite_auth/app.js +0 -74
- package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
- package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
- package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
- package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
- package/v2examplle/v2_sqlite_auth/package.json +0 -27
- package/v2examplle/v2_sqlite_auth/routes.json +0 -30
- package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
- package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
|
@@ -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
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
const {
|
|
2
|
-
APIServer,
|
|
3
|
-
Authenticator,
|
|
4
|
-
RouteLoader,
|
|
5
|
-
Logger,
|
|
6
|
-
MariaDBTokenAdapter
|
|
7
|
-
} = require('../../index.js');
|
|
8
|
-
|
|
9
|
-
async function startServer() {
|
|
10
|
-
// Crear instancia del servidor
|
|
11
|
-
const server = new APIServer({
|
|
12
|
-
port: 8090,
|
|
13
|
-
host: 'localhost'
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
// Crear instancia del logger
|
|
17
|
-
const logger = new Logger({ level: 'info' });
|
|
18
|
-
|
|
19
|
-
try {
|
|
20
|
-
// Crear instancia del adaptador de tokens MariaDB
|
|
21
|
-
const tokenAdapter = new MariaDBTokenAdapter({
|
|
22
|
-
host: 'localhost',
|
|
23
|
-
user: 'root',
|
|
24
|
-
password: '', // Dejar vacío si no hay contraseña para root
|
|
25
|
-
database: 'token_db',
|
|
26
|
-
tableName: 'mariadb_tokens'
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
// Inicializar el adaptador de tokens
|
|
30
|
-
await tokenAdapter.initialize();
|
|
31
|
-
logger.info('MariaDB Token Adapter inicializado correctamente');
|
|
32
|
-
|
|
33
|
-
// Crear instancia del autenticador
|
|
34
|
-
const authenticator = new Authenticator({ logger });
|
|
35
|
-
|
|
36
|
-
// Registrar estrategia de autenticación JWT que utiliza el adaptador MariaDB
|
|
37
|
-
authenticator.use('jwt-mariadb', async (req, options = {}) => {
|
|
38
|
-
const authHeader = req.headers.authorization;
|
|
39
|
-
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
|
|
40
|
-
|
|
41
|
-
if (!token) {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Validar el token contra la base de datos MariaDB
|
|
46
|
-
const tokenRecord = await tokenAdapter.validateToken(token);
|
|
47
|
-
|
|
48
|
-
if (tokenRecord) {
|
|
49
|
-
// Agregar información del usuario a la solicitud
|
|
50
|
-
req.user = {
|
|
51
|
-
userId: tokenRecord.user_id,
|
|
52
|
-
tokenType: tokenRecord.token_type,
|
|
53
|
-
expiresAt: tokenRecord.expires_at
|
|
54
|
-
};
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return false;
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// Agregar el autenticador al servidor para que pueda ser usado por el RouteLoader
|
|
62
|
-
server.authenticator = authenticator;
|
|
63
|
-
|
|
64
|
-
// Cargar rutas desde archivo JSON
|
|
65
|
-
const routeLoader = new RouteLoader();
|
|
66
|
-
await routeLoader.loadRoutes(server, './routes.json');
|
|
67
|
-
|
|
68
|
-
// Iniciar el servidor
|
|
69
|
-
server.start();
|
|
70
|
-
|
|
71
|
-
logger.info('Servidor iniciado en http://localhost:8090');
|
|
72
|
-
} catch (error) {
|
|
73
|
-
logger.error('Error iniciando el servidor:', error.message);
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Iniciar el servidor
|
|
79
|
-
startServer();
|
|
80
|
-
|
|
81
|
-
module.exports = { startServer };
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
const jwt = require('jsonwebtoken');
|
|
2
|
-
const { MariaDBTokenAdapter } = require('../../../index.js');
|
|
3
|
-
|
|
4
|
-
// Adaptador de tokens para este controlador
|
|
5
|
-
const tokenAdapter = new MariaDBTokenAdapter({
|
|
6
|
-
host: 'localhost',
|
|
7
|
-
user: 'root',
|
|
8
|
-
password: '',
|
|
9
|
-
database: 'token_db',
|
|
10
|
-
tableName: 'mariadb_tokens'
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
// Asegurarse de que el adaptador esté inicializado
|
|
14
|
-
tokenAdapter.initialize().catch(console.error);
|
|
15
|
-
|
|
16
|
-
const authController = {
|
|
17
|
-
login: async (req, res) => {
|
|
18
|
-
try {
|
|
19
|
-
const { username, password } = req.body;
|
|
20
|
-
|
|
21
|
-
// Validación simple de credenciales (esto debería ser más robusto en producción)
|
|
22
|
-
if (!username || !password) {
|
|
23
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
24
|
-
res.end(JSON.stringify({ error: 'Nombre de usuario y contraseña requeridos' }));
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Simulación de autenticación (en una aplicación real, esto verificaría contra una base de datos)
|
|
29
|
-
if (username === 'admin' && password === 'password') {
|
|
30
|
-
// Generar un token JWT
|
|
31
|
-
const payload = {
|
|
32
|
-
userId: 1,
|
|
33
|
-
username: username,
|
|
34
|
-
role: 'admin'
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
// Secret para firmar el token (en producción, debería estar en variables de entorno)
|
|
38
|
-
const secret = 'super-secret-key-for-mariadb-example';
|
|
39
|
-
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
|
|
40
|
-
|
|
41
|
-
// Guardar el token en la base de datos MariaDB
|
|
42
|
-
await tokenAdapter.saveToken(
|
|
43
|
-
token,
|
|
44
|
-
{ userId: 1 },
|
|
45
|
-
'access',
|
|
46
|
-
new Date(Date.now() + 60 * 60 * 1000) // 1 hora
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
50
|
-
res.end(JSON.stringify({
|
|
51
|
-
message: 'Inicio de sesión exitoso',
|
|
52
|
-
token: token,
|
|
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
|
-
logout: async (req, res) => {
|
|
67
|
-
try {
|
|
68
|
-
const authHeader = req.headers.authorization;
|
|
69
|
-
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
|
|
70
|
-
|
|
71
|
-
if (!token) {
|
|
72
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
73
|
-
res.end(JSON.stringify({ error: 'Token no proporcionado' }));
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Revocar el token en la base de datos MariaDB
|
|
78
|
-
const revoked = await tokenAdapter.revokeToken(token);
|
|
79
|
-
|
|
80
|
-
if (revoked) {
|
|
81
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
82
|
-
res.end(JSON.stringify({ message: 'Sesión cerrada exitosamente' }));
|
|
83
|
-
} else {
|
|
84
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
85
|
-
res.end(JSON.stringify({ error: 'No se pudo revocar el token' }));
|
|
86
|
-
}
|
|
87
|
-
} catch (error) {
|
|
88
|
-
console.error('Error en logout:', error);
|
|
89
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
90
|
-
res.end(JSON.stringify({ error: 'Error interno del servidor' }));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
module.exports = authController;
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
const jwt = require('jsonwebtoken');
|
|
2
|
-
const { MariaDBTokenAdapter } = require('../../../index.js');
|
|
3
|
-
|
|
4
|
-
// Adaptador de tokens para este controlador
|
|
5
|
-
const tokenAdapter = new MariaDBTokenAdapter({
|
|
6
|
-
host: 'localhost',
|
|
7
|
-
user: 'root',
|
|
8
|
-
password: '',
|
|
9
|
-
database: 'token_db',
|
|
10
|
-
tableName: 'mariadb_tokens'
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
// Asegurarse de que el adaptador esté inicializado
|
|
14
|
-
tokenAdapter.initialize().catch(console.error);
|
|
15
|
-
|
|
16
|
-
const mainController = {
|
|
17
|
-
home: (req, res) => {
|
|
18
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
19
|
-
res.end(JSON.stringify({
|
|
20
|
-
message: 'Bienvenido a la API de ejemplo con autenticación MariaDB',
|
|
21
|
-
endpoints: {
|
|
22
|
-
'POST /login': 'Iniciar sesión y obtener token',
|
|
23
|
-
'GET /protected': 'Contenido protegido (requiere token)',
|
|
24
|
-
'GET /profile': 'Perfil de usuario (requiere token)',
|
|
25
|
-
'POST /logout': 'Cerrar sesión y revocar token (requiere token)'
|
|
26
|
-
}
|
|
27
|
-
}));
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
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,17 +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
|
-
tokenType: req.user.tokenType,
|
|
10
|
-
expiresAt: req.user.expiresAt
|
|
11
|
-
},
|
|
12
|
-
message: 'Perfil de usuario obtenido exitosamente'
|
|
13
|
-
}));
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
module.exports = userController;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "jerk-mariadb-example",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Ejemplo de API con autenticación MariaDB 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
|
-
"mariadb",
|
|
15
|
-
"jwt",
|
|
16
|
-
"framework"
|
|
17
|
-
],
|
|
18
|
-
"author": "JERK Framework",
|
|
19
|
-
"license": "MIT",
|
|
20
|
-
"dependencies": {
|
|
21
|
-
"jsonwebtoken": "^9.0.0",
|
|
22
|
-
"mariadb": "^3.0.0"
|
|
23
|
-
},
|
|
24
|
-
"devDependencies": {
|
|
25
|
-
"nodemon": "^3.0.0"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -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-mariadb"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"path": "/profile",
|
|
25
|
-
"method": "GET",
|
|
26
|
-
"controller": "./controllers/userController.js",
|
|
27
|
-
"handler": "getProfile",
|
|
28
|
-
"auth": "jwt-mariadb"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"path": "/logout",
|
|
32
|
-
"method": "POST",
|
|
33
|
-
"controller": "./controllers/authController.js",
|
|
34
|
-
"handler": "logout",
|
|
35
|
-
"auth": "jwt-mariadb"
|
|
36
|
-
}
|
|
37
|
-
]
|
|
@@ -1,75 +0,0 @@
|
|
|
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 JERK.
|
|
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 JERK.
|
|
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`
|
|
@@ -1,72 +0,0 @@
|
|
|
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 };
|
|
@@ -1,14 +0,0 @@
|
|
|
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;
|
|
@@ -1,19 +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 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;
|
|
@@ -1,31 +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
|
-
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;
|
|
@@ -1,16 +0,0 @@
|
|
|
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;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "jerk-public-example",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Ejemplo de API pública sin autenticación 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
|
-
"public",
|
|
14
|
-
"no-authentication",
|
|
15
|
-
"framework"
|
|
16
|
-
],
|
|
17
|
-
"author": "JERK Framework",
|
|
18
|
-
"license": "MIT",
|
|
19
|
-
"devDependencies": {
|
|
20
|
-
"nodemon": "^3.0.0"
|
|
21
|
-
}
|
|
22
|
-
}
|