Skip to content

Commit 708e35f

Browse files
committed
merge dev
2 parents 67dcc60 + 1ada3e2 commit 708e35f

24 files changed

+1258
-455
lines changed

Procfile

-1
This file was deleted.

README.md

+27-8
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020

2121
Secure and easy-to-configure user authentication API developed using Node.js, Express, and MongoDB. It provides robust **password encryption**, **token-based authentication**, **email verification**, and **seamless email delivery** integration. With its straightforward setup, this project enables developers to quickly build a reliable and secure API user authentication system for their applications.
2222

23+
1. [Instalation](#📥-installation)
24+
2. [Configuration](#⚙️-configuration)
25+
- API
26+
- Database
27+
- Custom domain
28+
- Email sending
29+
3. [Deploying](#🚀-deploying)
30+
2331
## 🧩 Features
2432

2533
- ✅ Login attempts limited.
@@ -99,11 +107,12 @@ heroku login
99107

100108
Y persionamos ENTER. Nos abrirá una ventana para hacer login en nuestra cuenta de heroku.
101109

110+
Creamos una nueva app en heroku
111+
102112
````bash
103113
heroku create -a app-name
104114
````
105115

106-
Esto creará una nueva app en heroku.
107116

108117
Comprobamos que se ha configurado correctamente con:
109118

@@ -119,7 +128,10 @@ git remote -v
119128
> origin https://github.com/alexdeploy/node-auth-api.git (push)
120129
````
121130

122-
Configuramos las variables de entorno en heroku.
131+
Ahora vamos a configurar nuestras variables de entorno en heroku.
132+
133+
Introducimos todos las claves y valores del archivo `.env`.
134+
123135

124136
````bash
125137
heroku config:set NOMBRE_VARIABLE=valor
@@ -131,9 +143,7 @@ Comprobamos que se han guardado correctamente
131143
heroku config
132144
````
133145

134-
Vamos a nuestra aplicación -> Settings -> Config Bars.
135146

136-
Introducimos todos las claves y valores del archivo `.env`.
137147

138148
````bash
139149
# Desplegar la rama main
@@ -149,11 +159,15 @@ NOTAS IMPORTANTES SOBRE HEROKU CLI
149159

150160
- Para volver a hacer deploy en caso de falla, tienes que realizar por lo menos un `git commit`
151161

152-
### Set a custom domain
162+
## 🌎 Set a custom domain
153163

154-
Vamos a hacerlo utilizando los <a href="https://devcenter.heroku.com/articles/custom-domains">comandos `domain` de Heroku CLI</a>.
164+
> ➕ Proveedor de dominio
155165
156-
Si ya tenemos nuestro proveedor de dominios y nuestro dominio:
166+
Vamos a hacerlo utilizando los <a href="https://devcenter.heroku.com/articles/heroku-cli-commands">comandos de Heroku CLI</a>.
167+
168+
Pero también puedes ver de forma más detallada <a href="https://devcenter.heroku.com/articles/custom-domains">cómo configurar un dominio personalizado en Heroku</a>.
169+
170+
Añadimos un dominio a nuestro Heroku
157171

158172
````bash
159173
heroku domains:add www.example.com
@@ -171,7 +185,9 @@ heroku domains
171185

172186
Si te equivocas, se pueden borrar con `heroku domains:remove www.example.com`.
173187

174-
El DNS Target es el que tenemos que introducir en el valor CNAME de los registros DNS de nuestro dominio. El proveedor de dominio en este caso va a ser <a href="https://www.hostinger.com/">hostinger.com</a>.
188+
El DNS Target es el que tenemos que introducir en el valor CNAME de los registros DNS de nuestro dominio. El proveedor de dominio en este caso va a ser <a href="https://www.hostinger.com/">hostinger.com</a>.
189+
190+
> ¿Hay que borrar todos los otros valores CNAME del dominio?
175191
176192
Quedando así:
177193

@@ -181,6 +197,9 @@ Quedando así:
181197

182198
En caso de un subdominio, habría que introducir solo su nombre, por ejemplo introduciendo `api`, apuntaría a `api.example.com`.
183199

200+
## 📧 Configure email sending
201+
202+
184203

185204
## 📜 Documentation
186205

__tests__/authorization.test.js

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// TODO: Testear el middleware de autorización
2+
// TODO: Testear las funciones de verificación de tokens y su expiración
3+
// TODO: Testear el bloqueo de cuentas por intentos fallidos de inicio de sesión
4+
// TODO: Testear el envío de correos electrónicos

api.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class Config {
88

99
buildConfigurations() {
1010
const configDirPath = path.join(__dirname, "config");
11-
const allowedExtension = ".config.js";
11+
const allowedExtension = ".config.js"; // Only load config.js files
1212

1313
// Read all files from /config path
1414
fs.readdirSync(configDirPath).forEach((file) => {

config/cors.config.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,23 @@ module.exports = {
22
// Opciones de configuración para CORS
33
options: {
44
// 1. Origen permitido para las solicitudes (valor por defecto: '*')
5-
origin: '*', // Recomendación: Establece el dominio o URL desde donde se permitirán las solicitudes.
6-
5+
origin: '*', // Recomendación: Establece el dominio o URL desde donde se permitirán las solicitudes.
6+
77
// 2. Métodos HTTP permitidos (valor por defecto: 'GET,HEAD,PUT,PATCH,POST,DELETE')
88
methods: 'GET,POST,PUT,DELETE', // Recomendación: Define los métodos HTTP que se pueden utilizar en las solicitudes. Ajusta según las necesidades de tu API.
99

1010
// 3. Encabezados permitidos en las solicitudes (valor por defecto: 'Content-Type')
11-
allowedHeaders: 'Authorization,Content-Type', // Recomendación: Indica qué encabezados se permiten en las solicitudes. Habilita el encabezado 'Authorization' para permitir autenticación con tokens.
12-
11+
allowedHeaders: 'Authorization,Content-Type,Access-Control-Allow-Origin', // Recomendación: Indica qué encabezados se permiten en las solicitudes. Habilita el encabezado 'Authorization' para permitir autenticación con tokens.
12+
1313
// 4. Encabezados expuestos en las respuestas (valor por defecto: '')
14-
exposedHeaders: 'Authorization', // Recomendación: Define qué encabezados se pueden mostrar en las respuestas del servidor. Exponer el encabezado 'Authorization' permite que el cliente acceda a ese encabezado en las respuestas.
14+
/* exposedHeaders: 'Authorization', */ // Recomendación: Define qué encabezados se pueden mostrar en las respuestas del servidor. Exponer el encabezado 'Authorization' permite que el cliente acceda a ese encabezado en las respuestas.
1515

1616
// 5. Permitir el uso de credenciales (valor por defecto: false)
17-
credentials: true, // Recomendación: Habilita el uso de credenciales (como cookies o encabezados de autorización) en las solicitudes para permitir autenticación con credenciales.
18-
17+
/* credentials: true, */ // Recomendación: Habilita el uso de credenciales (como cookies o encabezados de autorización) en las solicitudes para permitir autenticación con credenciales.
18+
19+
preflightContinue: false,
20+
21+
optionsSuccessStatus: 204,
1922
// 6. Tiempo en segundos para cachear las opciones preflight (valor por defecto: 86400 segundos / 24 horas)
2023
maxAge: 3600 // Recomendación: Especifica el tiempo en segundos que los navegadores deben almacenar en caché las opciones preflight. Ajusta según las necesidades de tu API.
2124
}

config/domain.config.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ require('dotenv').config();
22

33
module.exports = {
44
name: {
5-
server: 'http://localhost',
6-
client: 'http://localhost'
5+
prod_server: 'https://api.alexrueda.dev',
6+
prod_client: 'https://app.alexrueda.dev',
7+
dev_server: 'http://localhost',
8+
dev_client: 'http://localhost'
79
},
810
port: {
911
server: process.env.PORT_SERVER || 5000,

config/register.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module.exports = {
22
verification: {
3-
active: true,
3+
active: false,
44
method: 'email', // 'email' or 'phone'
55
}
66
}

config/response.config.js

+127
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
module.exports = {
2+
auth: {
3+
sign_up: {
4+
success: {
5+
code: 200,
6+
value: 'sign_up_success',
7+
message: 'Sign up successfull'
8+
},
9+
error: {
10+
email_already_exists: {
11+
code: 400,
12+
value: 'email_already_exists',
13+
message: 'Email already exists'
14+
},
15+
username_already_exists: {
16+
code: 400,
17+
value: 'username_already_exists',
18+
message: 'Username already exists'
19+
},
20+
incorrect_password: {
21+
code: 400,
22+
value: 'incorrect_password',
23+
message: 'Incorrect password'
24+
},
25+
invalid_email: {
26+
// In case the email don't match the regex
27+
code: 400,
28+
value: 'invalid_email',
29+
message: 'Invalid email'
30+
},
31+
invalid_username: {
32+
// In case the username don't match the regex
33+
code: 400,
34+
value: 'invalid_username',
35+
message: 'Invalid username'
36+
},
37+
invalid_password: {
38+
// In case the password don't match the regex
39+
code: 400,
40+
value: 'invalid_password',
41+
message: 'Invalid password'
42+
},
43+
}
44+
},
45+
sign_in: {
46+
success: {
47+
code: 200,
48+
value: 'sign_in_success',
49+
message: 'Sign in success'
50+
},
51+
error: {
52+
user_not_found: {
53+
code: 404,
54+
value: 'user_not_found',
55+
message: 'User not found'
56+
},
57+
user_is_locked: {
58+
code: 423,
59+
value: 'user_is_locked',
60+
message: 'User is locked'
61+
},
62+
user_is_not_verified: {
63+
code: 400,
64+
value: 'user_is_not_verified',
65+
message: 'User is not verified'
66+
},
67+
incorrect_password: {
68+
code: 401,
69+
value: 'incorrect_password',
70+
message: 'Incorrect password'
71+
},
72+
invalid_email: {
73+
// In case the email don't match the regex
74+
code: 400,
75+
value: 'invalid_email',
76+
message: 'Invalid email. The email does not match the regex'
77+
},
78+
invalid_username: {
79+
// In case the username don't match the regex
80+
code: 400,
81+
value: 'invalid_username',
82+
message: 'Invalid username. The username does not match the regex'
83+
},
84+
invalid_password: {
85+
// In case the password don't match the regex
86+
code: 400,
87+
value: 'invalid_password',
88+
message: 'Invalid password. The password does not match the regex'
89+
},
90+
max_attempt_reached: {
91+
code: 429,
92+
value: 'max_attempt_reached',
93+
message: 'Max sign in attempts reached'
94+
},
95+
}
96+
},
97+
forgot_password: {
98+
success: {},
99+
error: {}
100+
},
101+
reset_password: {
102+
success: {},
103+
error: {}
104+
},
105+
verify_email: {
106+
success: {},
107+
error: {}
108+
},
109+
verify_phone: {
110+
success: {},
111+
error: {}
112+
},
113+
verify_token: {
114+
success: {},
115+
error: {}
116+
},
117+
server: {
118+
success: {},
119+
error: {
120+
internal: {
121+
code: 500,
122+
message: 'Internal server error'
123+
}
124+
}
125+
}
126+
}
127+
}

config/roles.config.js

+5
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,9 @@ module.exports = {
2323
name: 'guest',
2424
description: 'Guest'
2525
},
26+
all: {
27+
id: 999,
28+
name: 'all',
29+
description: 'All Roles'
30+
}
2631
}

config/security.config.js

+23-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Security Configuration
33
///////////////////////////////
44

5+
// expiration accepted values: 1m = 1 minute, 1h = 1 hour, 1d = 1 day, 1w = 1 week
6+
57
/**
68
* @module security.config
79
* @description Defines the user roles
@@ -10,6 +12,26 @@ module.exports = {
1012
logginAttempts: {
1113
active: true,
1214
max: 5,
13-
lockTime: 1
15+
lockTime: 1 // minutes
16+
},
17+
tokens: {
18+
session: {
19+
active: true,
20+
expiration: '1d' // 1m = 1 minute, 1h = 1 hour, 1d = 1 day, 1w = 1 week
21+
},
22+
reset_password: {
23+
active: true,
24+
expiration: '1h'
25+
},
26+
verification: {
27+
phone: {
28+
active: true,
29+
expiration: '1d'
30+
},
31+
email: {
32+
active: true,
33+
expiration: '30m'
34+
}
35+
},
1436
}
1537
}

0 commit comments

Comments
 (0)