﻿1
00:00:01,260 --> 00:00:02,480
‫Jonas: Entonces, en

2
00:00:02,480 --> 00:00:04,560
‫esta conferencia, implementaremos la funcionalidad de iniciar

3
00:00:04,560 --> 00:00:08,010
‫la sesión de los usuarios en función de una contraseña y una

4
00:00:08,010 --> 00:00:09,363
‫dirección de correo electrónico determinadas.

5
00:00:10,920 --> 00:00:14,520
‫Y al igual que antes, el concepto de iniciar la sesión

6
00:00:14,520 --> 00:00:17,400
‫de un usuario básicamente significa firmar un token web

7
00:00:17,400 --> 00:00:19,760
‫JSON y enviarlo de vuelta al cliente.

8
00:00:19,760 --> 00:00:22,390
‫Pero en este caso solo emitimos el token

9
00:00:22,390 --> 00:00:24,860
‫en caso de que el usuario realmente exista

10
00:00:24,860 --> 00:00:27,310
‫y que la contraseña sea correcta.

11
00:00:27,310 --> 00:00:29,773
‫Entonces, comencemos a implementar eso.

12
00:00:31,480 --> 00:00:36,260
‫Exportaciones. iniciar sesión es ...

13
00:00:39,090 --> 00:00:42,253
‫solicitud, respuesta y siguiente.

14
00:00:44,370 --> 00:00:47,060
‫Y lo primero que debemos hacer es

15
00:00:47,060 --> 00:00:50,020
‫leer el correo electrónico y la contraseña del cuerpo.

16
00:00:50,020 --> 00:00:54,740
‫Entonces, digamos que el correo electrónico constante es igual a req. cuerpo. Email.

17
00:00:58,920 --> 00:01:02,070
‫Bien, y ahora eslint nos da esta advertencia, o este

18
00:01:02,070 --> 00:01:04,160
‫error en realidad, y dice

19
00:01:04,160 --> 00:01:07,080
‫que deberíamos usar la desestructuración de objetos, ¿de acuerdo?

20
00:01:07,080 --> 00:01:09,620
‫Así que dejé que esto sucediera aquí

21
00:01:09,620 --> 00:01:12,620
‫a propósito solo para poder mostrarles cómo podemos hacerlo

22
00:01:12,620 --> 00:01:14,950
‫con la desestructuración de ES6.

23
00:01:14,950 --> 00:01:18,490
‫Y creo que hablé de esto antes en el curso, y

24
00:01:18,490 --> 00:01:20,930
‫también espero que ya esté familiarizado con

25
00:01:20,930 --> 00:01:23,330
‫el concepto, pero de todos modos, dado

26
00:01:23,330 --> 00:01:25,430
‫que el nombre de esta

27
00:01:25,430 --> 00:01:27,920
‫propiedad aquí es el mismo que el

28
00:01:27,920 --> 00:01:30,260
‫nombre de la variable, simplemente podemos hacerlo

29
00:01:30,260 --> 00:01:34,150
‫como esto y deshacerse del nombre de la propiedad aquí, ¿de acuerdo?

30
00:01:34,150 --> 00:01:36,520
‫Y también queremos obtener la contraseña.

31
00:01:36,520 --> 00:01:37,930
‫Y entonces eso sería lo mismo,

32
00:01:37,930 --> 00:01:42,470
‫entonces, básicamente, contraseña equivale a una solicitud. cuerpo. contraseña.

33
00:01:42,470 --> 00:01:43,647
‫Y en lugar

34
00:01:43,647 --> 00:01:47,940
‫de hacer eso, simplemente podemos usar el correo electrónico y la contraseña.

35
00:01:47,940 --> 00:01:50,250
‫Y así, así, básicamente

36
00:01:50,250 --> 00:01:54,480
‫creamos estas dos variables del objeto del cuerpo, ¿de acuerdo?

37
00:01:54,480 --> 00:01:56,380
‫Básicamente, así es como el

38
00:01:56,380 --> 00:02:00,223
‫usuario enviará las credenciales de inicio de sesión para que las verifiquemos.

39
00:02:01,070 --> 00:02:04,130
‫De acuerdo, y ese proceso de verificación tiene un par de

40
00:02:04,130 --> 00:02:05,830
‫pasos, así que vamos a

41
00:02:05,830 --> 00:02:07,750
‫exponerlos aquí antes de comenzar a codificar.

42
00:02:07,750 --> 00:02:12,030
‫Entonces, primero debemos verificar si el

43
00:02:12,030 --> 00:02:17,030
‫correo electrónico y las contraseñas realmente existen, ¿de acuerdo?

44
00:02:17,900 --> 00:02:22,900
‫Luego, número dos, verifique si el usuario existe y,

45
00:02:24,440 --> 00:02:29,440
‫al mismo tiempo, si la contraseña es correcta.

46
00:02:31,960 --> 00:02:33,943
‫Y luego, en tercer lugar,

47
00:02:39,440 --> 00:02:44,440
‫si todo está bien, envíe el token, para que el token web JSON vuelva al cliente.

48
00:02:45,800 --> 00:02:48,490
‫Bien, entonces el primero es muy fácil.

49
00:02:48,490 --> 00:02:53,490
‫Entonces, si no hay correo electrónico o contraseña, queremos enviar

50
00:02:56,810 --> 00:03:00,370
‫un mensaje de error a nuestro cliente.

51
00:03:00,370 --> 00:03:02,600
‫Ahora, ¿cómo vamos a hacer eso?

52
00:03:02,600 --> 00:03:04,490
‫Bueno, lo haremos usando

53
00:03:04,490 --> 00:03:07,490
‫las herramientas que implementamos en la última sección.

54
00:03:07,490 --> 00:03:10,730
‫Entonces, básicamente, el error de nuestra aplicación, ¿lo recuerdas?

55
00:03:10,730 --> 00:03:12,977
‫Entonces, simplemente crearemos un nuevo error

56
00:03:12,977 --> 00:03:15,060
‫aquí, y nuestro middleware de

57
00:03:15,060 --> 00:03:19,190
‫manejo de errores globales lo detectará y enviará ese error al cliente.

58
00:03:19,190 --> 00:03:22,483
‫Entonces, comencemos por importar ese error.

59
00:03:23,350 --> 00:03:25,260
‫Así que recuerda que

60
00:03:25,260 --> 00:03:28,463
‫es este de nuestra clase AppError, ¿verdad?

61
00:03:29,620 --> 00:03:34,620
‫Así que digamos AppError y luego require.

62
00:03:40,860 --> 00:03:44,150
‫Entonces, un nivel desde aquí, luego en las utilidades y luego

63
00:03:44,150 --> 00:03:45,050
‫en appError.

64
00:03:48,990 --> 00:03:52,430
‫De acuerdo, entonces tenemos que llamar al siguiente

65
00:03:52,430 --> 00:03:56,403
‫middleware, y aquí es donde pasamos el error, ¿recuerdas eso?

66
00:03:57,260 --> 00:04:00,363
‫Entonces, nuevo AppError, y el

67
00:04:02,510 --> 00:04:07,510
‫mensaje es: proporcione un correo electrónico y una contraseña.

68
00:04:07,530 --> 00:04:12,530
‫Y el código de error HTTP es 400 para una solicitud incorrecta, ¿de acuerdo?

69
00:04:12,720 --> 00:04:14,340
‫Y ahora tengo algunos

70
00:04:14,340 --> 00:04:19,090
‫errores aquí, así que, nuevamente, eslint me está ayudando a corregir algunos errores.

71
00:04:19,090 --> 00:04:20,710
‫Entonces veo eso

72
00:04:20,710 --> 00:04:24,010
‫aquí, nuevamente, lo usé con una T en lugar

73
00:04:24,010 --> 00:04:27,740
‫de D, y si lo guardo ahora, todo está correcto.

74
00:04:27,740 --> 00:04:32,393
‫Bien, entonces comencemos a probar esto de inmediato.

75
00:04:33,330 --> 00:04:34,700
‫Y para eso,

76
00:04:34,700 --> 00:04:39,700
‫simplemente comenzaré creando una ficha falsa aquí por ahora, está bien.

77
00:04:39,930 --> 00:04:43,287
‫Entonces digamos res. estado 200 para ok.

78
00:04:51,202 --> 00:04:53,573
‫JSON y, por supuesto, como

79
00:04:56,540 --> 00:05:01,010
‫siempre, el estado establecido en éxito, y luego también nuestro token.

80
00:05:01,010 --> 00:05:02,870
‫Y eso es todo lo que

81
00:05:02,870 --> 00:05:05,130
‫enviaremos como respuesta al inicio de sesión, ¿de acuerdo?

82
00:05:05,130 --> 00:05:08,290
‫Entonces, ningún usuario se opone porque eso no es necesario en absoluto.

83
00:05:08,290 --> 00:05:10,800
‫Todo lo que queremos como respuesta para iniciar sesión es

84
00:05:10,800 --> 00:05:12,140
‫en realidad el token.

85
00:05:12,140 --> 00:05:15,033
‫Eso es todo lo que importa cuando el usuario inicia sesión.

86
00:05:16,210 --> 00:05:18,960
‫A continuación, necesitamos implementar la ruta,

87
00:05:18,960 --> 00:05:23,600
‫así que hagámoslo de nuevo en nuestro enrutador de usuario, ¿de acuerdo?

88
00:05:23,600 --> 00:05:27,000
‫Y este es bastante similar a este.

89
00:05:27,000 --> 00:05:30,310
‫Dupliquemoslo y luego reemplacemos el registro en

90
00:05:30,310 --> 00:05:34,780
‫ambos casos aquí con el inicio de sesión, ¿de acuerdo?

91
00:05:34,780 --> 00:05:38,220
‫Y nuevamente, esto solo es válido para una solicitud de publicación,

92
00:05:38,220 --> 00:05:40,360
‫porque, por supuesto, queremos enviar las

93
00:05:40,360 --> 00:05:43,200
‫credenciales de inicio de sesión en el cuerpo.

94
00:05:43,200 --> 00:05:44,630
‫Y, de nuevo, es

95
00:05:44,630 --> 00:05:47,610
‫una publicación, pero no una obtención, ni un parche, ni una

96
00:05:47,610 --> 00:05:50,393
‫eliminación, porque eso no tiene ningún sentido en este caso.

97
00:05:51,590 --> 00:05:54,033
‫Así que probémoslo de inmediato.

98
00:05:54,970 --> 00:05:57,033
‫Copiaré esta URL aquí también.

99
00:05:58,050 --> 00:06:03,050
‫Será publicación, inicio de sesión y luego el cuerpo,

100
00:06:03,570 --> 00:06:05,140
‫por supuesto.

101
00:06:05,140 --> 00:06:08,700
‫Así que de nuevo, raw y JSON.

102
00:06:08,700 --> 00:06:11,443
‫Así que creemos un cuerpo simple aquí.

103
00:06:17,680 --> 00:06:19,960
‫De acuerdo, intentemos enviar

104
00:06:19,960 --> 00:06:22,993
‫esto sin contraseña y veamos qué sucede.

105
00:06:24,460 --> 00:06:27,470
‫Y, de hecho, funciona, por lo que recibimos nuestro mensaje

106
00:06:27,470 --> 00:06:30,030
‫aquí: proporcione un correo electrónico y una contraseña.

107
00:06:30,030 --> 00:06:31,820
‫Y nuevamente, dado que estamos

108
00:06:31,820 --> 00:06:34,110
‫en desarrollo, estamos obteniendo toda esta pila de

109
00:06:34,110 --> 00:06:36,910
‫errores aquí, y el error completo con nuestro código

110
00:06:36,910 --> 00:06:39,350
‫de estado, el estado y también, por supuesto,

111
00:06:39,350 --> 00:06:41,330
‫diciendo que es un error operativo.

112
00:06:41,330 --> 00:06:45,840
‫Así que tal como lo definimos en la sección anterior, ¿de acuerdo?

113
00:06:45,840 --> 00:06:48,433
‫Ahora intentemos lo mismo con la contraseña.

114
00:06:50,750 --> 00:06:55,750
‫Entonces, configúrelo en Creo que este era el indicado, y luego

115
00:06:56,400 --> 00:06:58,893
‫deshágase del correo electrónico.

116
00:07:00,590 --> 00:07:02,950
‫Y eso, por supuesto, desencadena lo mismo.

117
00:07:02,950 --> 00:07:06,000
‫De acuerdo, y con todo correcto, debería funcionar, y

118
00:07:06,000 --> 00:07:08,803
‫de hecho obtenemos nuestro token falso aquí.

119
00:07:10,300 --> 00:07:12,890
‫Ahora solo una cosa que debemos hacer

120
00:07:12,890 --> 00:07:14,880
‫aquí es regresar también.

121
00:07:14,880 --> 00:07:16,790
‫Así que lo hicimos muchas veces

122
00:07:16,790 --> 00:07:18,680
‫antes, y permítanme explicarlo nuevamente.

123
00:07:18,680 --> 00:07:21,610
‫Es simplemente porque después de llamar al siguiente

124
00:07:21,610 --> 00:07:24,380
‫middleware, queremos asegurarnos de que esta

125
00:07:24,380 --> 00:07:27,873
‫función de inicio de sesión finalice de inmediato, ¿de acuerdo?

126
00:07:30,260 --> 00:07:32,080
‫Y como no teníamos eso

127
00:07:32,080 --> 00:07:34,560
‫antes, ahora verá este error aquí nuevamente.

128
00:07:34,560 --> 00:07:38,060
‫Entonces esto ya es algo familiar en este punto, ¿verdad?

129
00:07:38,060 --> 00:07:40,940
‫Por lo tanto, no se pueden establecer encabezados después de que

130
00:07:40,940 --> 00:07:43,360
‫se envían al cliente, porque nuevamente, enviamos dos respuestas.

131
00:07:43,360 --> 00:07:47,840
‫Primero la respuesta de error, y luego también este código aquí ejecutado, lo que por

132
00:07:47,840 --> 00:07:50,040
‫supuesto no debería haber sido así.

133
00:07:50,040 --> 00:07:52,933
‫Y de nuevo usamos return here para arreglar eso.

134
00:07:53,790 --> 00:07:57,430
‫Bien, a continuación, verifiquemos si realmente hay un usuario para

135
00:07:57,430 --> 00:07:59,870
‫el correo electrónico que se publicó.

136
00:07:59,870 --> 00:08:04,870
‫Entonces, const user, y ahora usemos findOne en realidad, porque esta vez

137
00:08:09,940 --> 00:08:13,400
‫no estamos seleccionando un usuario por la ID,

138
00:08:13,400 --> 00:08:16,650
‫sino por su correo electrónico, ¿verdad?

139
00:08:16,650 --> 00:08:19,460
‫Y entonces tenemos que pasar ese objeto

140
00:08:19,460 --> 00:08:24,190
‫de filtro donde podemos decir correo electrónico igual a correo electrónico, ¿de acuerdo?

141
00:08:24,190 --> 00:08:25,940
‫Entonces, el campo se llama correo

142
00:08:25,940 --> 00:08:28,270
‫electrónico y la variable también se llama correo electrónico.

143
00:08:28,270 --> 00:08:32,163
‫Y entonces en ES6 podemos abreviar eso simplemente así.

144
00:08:33,060 --> 00:08:34,490
‫Ahora, antes de

145
00:08:34,490 --> 00:08:36,110
‫que avancemos aquí, en realidad

146
00:08:36,110 --> 00:08:38,520
‫hay algo importante que debo hacer por seguridad.

147
00:08:38,520 --> 00:08:41,220
‫Déjame mostrarte eso en Postman,

148
00:08:41,220 --> 00:08:43,970
‫donde nos registramos para una nueva cuenta.

149
00:08:43,970 --> 00:08:46,540
‫Y entonces ven aquí que en la

150
00:08:46,540 --> 00:08:49,810
‫salida del usuario, en realidad obtenemos la contraseña, ¿de acuerdo?

151
00:08:49,810 --> 00:08:52,010
‫En realidad, está encriptado, pero

152
00:08:52,010 --> 00:08:55,010
‫aún así, no es una buena práctica filtrar los

153
00:08:55,010 --> 00:08:57,710
‫datos de la contraseña al cliente, ¿de acuerdo?

154
00:08:57,710 --> 00:09:01,090
‫Por ejemplo, si tuviéramos que obtener todos los usuarios

155
00:09:01,090 --> 00:09:03,480
‫aquí, y esta ruta aún no está

156
00:09:03,480 --> 00:09:07,170
‫implementada, pero si tuviéramos que obtener todos los usuarios de

157
00:09:07,170 --> 00:09:09,440
‫la colección, entonces todos tendrían

158
00:09:09,440 --> 00:09:12,720
‫la contraseña visible, y no queremos eso. , ¿okey?

159
00:09:12,720 --> 00:09:15,790
‫Y arreglarlo es bastante fácil, porque

160
00:09:15,790 --> 00:09:17,850
‫lo hicimos antes.

161
00:09:17,850 --> 00:09:19,973
‫Todo lo que tenemos que

162
00:09:20,820 --> 00:09:25,270
‫hacer es decir la contraseña, luego seleccionarla y configurarla como falsa.

163
00:09:25,270 --> 00:09:28,100
‫Y así, nunca aparecerá automáticamente en

164
00:09:28,100 --> 00:09:29,123
‫ninguna salida.

165
00:09:30,520 --> 00:09:32,520
‫Y dejar que

166
00:09:32,520 --> 00:09:37,023
‫te lo demuestre registrándote como otra cosa, así.

167
00:09:39,070 --> 00:09:41,920
‫Y veamos, oh, en realidad ya tenemos

168
00:09:41,920 --> 00:09:45,833
‫un usuario con ese correo electrónico, así que hagamos test3.

169
00:09:47,300 --> 00:09:50,830
‫Y ahora la contraseña todavía está aquí, pero supongo que

170
00:09:50,830 --> 00:09:54,100
‫es simplemente porque podríamos crearlo, este nuevo documento aquí y,

171
00:09:54,100 --> 00:09:55,610
‫por lo tanto,

172
00:09:55,610 --> 00:09:58,030
‫no lo está seleccionando realmente porque en

173
00:09:58,030 --> 00:10:01,460
‫realidad no lo estamos leyendo de la base de datos.

174
00:10:01,460 --> 00:10:03,250
‫Así que implementemos

175
00:10:03,250 --> 00:10:05,100
‫muy rápidamente esta ruta

176
00:10:05,100 --> 00:10:07,690
‫aquí, eso solo tomará un minuto.

177
00:10:07,690 --> 00:10:10,300
‫Entonces, solo para ver si esto de aquí realmente funciona.

178
00:10:10,300 --> 00:10:12,230
‫Porque este paso es realmente

179
00:10:12,230 --> 00:10:15,170
‫importante para lo que haremos a continuación, ¿de acuerdo?

180
00:10:15,170 --> 00:10:18,820
‫Así que sigamos adelante y copiemos este código de getAllTours,

181
00:10:18,820 --> 00:10:22,000
‫y no copiemos realmente, pero lo que vamos a

182
00:10:22,000 --> 00:10:25,133
‫hacer es bastante similar a esto, por supuesto.

183
00:10:26,750 --> 00:10:28,590
‫Así que simplemente copiaré esto,

184
00:10:28,590 --> 00:10:30,450
‫pero sin las funciones de la API.

185
00:10:30,450 --> 00:10:33,700
‫Así que no estoy realmente interesado en eso, ¿de acuerdo?

186
00:10:33,700 --> 00:10:35,500
‫Y este lo voy a

187
00:10:35,500 --> 00:10:39,170
‫hacer en el controlador de usuario, porque obtener todos los usuarios no

188
00:10:39,170 --> 00:10:41,350
‫tiene nada que ver con la autenticación.

189
00:10:41,350 --> 00:10:43,570
‫Entonces, en este caso, el

190
00:10:43,570 --> 00:10:47,020
‫controlador de usuario es el lugar perfecto para hacer esto.

191
00:10:47,020 --> 00:10:49,440
‫Ahora, por supuesto, también necesito importar

192
00:10:49,440 --> 00:10:51,990
‫rápidamente el modelo de usuario aquí, así que

193
00:10:51,990 --> 00:10:56,580
‫copiemos también eso del tourController, que no es el mismo, pero sí similar.

194
00:10:56,580 --> 00:11:00,550
‫Así que tomemos todo esto en nuestro

195
00:11:04,200 --> 00:11:06,370
‫controlador de usuario.

196
00:11:06,370 --> 00:11:09,683
‫Este no lo necesitamos, pero también necesitamos catchAsync.

197
00:11:10,520 --> 00:11:13,640
‫Bien, entonces tour será

198
00:11:13,640 --> 00:11:18,400
‫usuario, y aquí estará userModel, ¿de acuerdo?

199
00:11:18,400 --> 00:11:21,420
‫Luego aquí tenemos recorridos, y aquí abajo y aquí abajo,

200
00:11:21,420 --> 00:11:23,790
‫así que presiono Comando + D para

201
00:11:23,790 --> 00:11:26,033
‫seleccionarlos todos y cambiarlos a usuarios.

202
00:11:27,190 --> 00:11:32,190
‫Y luego aquí, por supuesto, lo que estamos esperando es Usuario. encontrar.

203
00:11:34,870 --> 00:11:36,320
‫Ahora que

204
00:11:36,320 --> 00:11:41,310
‫tenemos una espera aquí, necesitamos async, luego también necesitamos next, y dado

205
00:11:41,310 --> 00:11:42,810
‫que tenemos una async

206
00:11:42,810 --> 00:11:46,580
‫aquí, deberíamos envolver todo en una captura asincrónica.

207
00:11:46,580 --> 00:11:47,713
‫Así que hagámoslo.

208
00:11:50,090 --> 00:11:51,700
‫De acuerdo, y en

209
00:11:51,700 --> 00:11:53,810
‫este punto esto ya no es nada

210
00:11:53,810 --> 00:11:58,120
‫nuevo para ti, ya estamos acostumbrados a hacer este tipo de cosas, ¿verdad?

211
00:11:58,120 --> 00:12:00,670
‫Entonces, esto ya debería funcionar en este

212
00:12:00,670 --> 00:12:02,470
‫punto, así que probémoslo.

213
00:12:02,470 --> 00:12:06,460
‫Entonces, obtenga todos los usuarios, y ahora, de hecho, vemos que

214
00:12:06,460 --> 00:12:10,030
‫su contraseña no está incluida en la salida.

215
00:12:10,030 --> 00:12:13,853
‫Y eso es importante porque en realidad, en el hallazgo,

216
00:12:15,090 --> 00:12:17,093
‫aquí en el AuthController,

217
00:12:18,030 --> 00:12:21,490
‫esto aquí ahora tampoco contendrá la contraseña, ¿de acuerdo?

218
00:12:21,490 --> 00:12:23,060
‫Y entonces la salida

219
00:12:23,060 --> 00:12:25,920
‫de esto aquí ahora tampoco contendrá la contraseña.

220
00:12:25,920 --> 00:12:28,890
‫Pero necesitamos la contraseña para verificar si

221
00:12:28,890 --> 00:12:30,810
‫es correcta, ¿verdad?

222
00:12:30,810 --> 00:12:34,500
‫Y, por lo tanto, también debemos seleccionarlo explícitamente.

223
00:12:34,500 --> 00:12:37,460
‫Entonces, ¿recuerdas cómo usamos select antes para

224
00:12:37,460 --> 00:12:40,150
‫básicamente seleccionar un par de campos

225
00:12:40,150 --> 00:12:43,450
‫de la base de datos, solo los que necesitábamos?

226
00:12:43,450 --> 00:12:45,460
‫Ahora, en este caso, cuando queremos

227
00:12:45,460 --> 00:12:47,640
‫que el campo que está por defecto no

228
00:12:47,640 --> 00:12:50,853
‫esté seleccionado, necesitamos user plus y luego el nombre del campo.

229
00:12:51,720 --> 00:12:53,610
‫Entonces contraseña en este caso.

230
00:12:53,610 --> 00:12:58,220
‫Y así, volverá a aparecer en la salida, ¿de acuerdo?

231
00:12:58,220 --> 00:13:01,750
‫Por supuesto, debemos esperar esta

232
00:13:01,750 --> 00:13:06,260
‫consulta y luego marcar la función como asíncrona.

233
00:13:06,260 --> 00:13:08,140
‫Y luego,

234
00:13:08,140 --> 00:13:12,010
‫como antes, para evitar ese feo bloque

235
00:13:12,010 --> 00:13:16,253
‫try catch, envuelva toda esta función en catchAsync.

236
00:13:18,520 --> 00:13:20,163
‫Está bien, ¿tiene sentido?

237
00:13:22,170 --> 00:13:26,770
‫Así que ahora, rápidamente, registremos al usuario en la consola, solo para

238
00:13:26,770 --> 00:13:28,353
‫ver si funciona.

239
00:13:32,220 --> 00:13:34,033
‫Así que este de aquí.

240
00:13:35,460 --> 00:13:39,600
‫Obtenemos nuestro éxito y, de hecho, tenemos al usuario aquí.

241
00:13:39,600 --> 00:13:42,650
‫Entonces, exactamente con el correo electrónico que acabo de

242
00:13:42,650 --> 00:13:45,830
‫publicar, y luego la contraseña ahora también se incluye

243
00:13:45,830 --> 00:13:47,890
‫en la salida, ¿de acuerdo?

244
00:13:47,890 --> 00:13:51,453
‫Y nuevamente, eso es porque lo seleccionamos explícitamente aquí.

245
00:13:52,490 --> 00:13:54,950
‫Y ahora es el momento de comparar las contraseñas

246
00:13:54,950 --> 00:13:57,400
‫que tenemos en la base de datos con

247
00:13:57,400 --> 00:13:59,830
‫la que acaba de publicar el usuario.

248
00:13:59,830 --> 00:14:01,930
‫Pero, ¿cómo vamos a hacer eso?

249
00:14:01,930 --> 00:14:05,190
‫Porque, por ejemplo, la contraseña puede

250
00:14:05,190 --> 00:14:09,169
‫ser, o es en este ejemplo, pass1234, pero

251
00:14:09,169 --> 00:14:13,983
‫la que tenemos almacenada en el documento se ve así.

252
00:14:15,040 --> 00:14:17,220
‫Entonces, ¿cómo vamos a comparar esto?

253
00:14:17,220 --> 00:14:19,960
‫Realmente no hay una forma de hacerlo, ¿verdad?

254
00:14:19,960 --> 00:14:22,300
‫Pero en realidad lo hay, todo lo

255
00:14:22,300 --> 00:14:25,890
‫que tenemos que hacer es volver a usar el paquete bcrypt, ¿de acuerdo?

256
00:14:25,890 --> 00:14:29,400
‫Entonces usamos bcrypt para generar esta contraseña hash, y también

257
00:14:29,400 --> 00:14:31,230
‫podemos usar el mismo paquete

258
00:14:31,230 --> 00:14:34,930
‫para comparar básicamente una contraseña original como esta aquí con

259
00:14:34,930 --> 00:14:36,283
‫la contraseña hash.

260
00:14:37,230 --> 00:14:40,700
‫Por supuesto, esta contraseña aquí, ya que está encriptada, no

261
00:14:40,700 --> 00:14:43,350
‫hay forma de recuperar la anterior,

262
00:14:43,350 --> 00:14:46,680
‫así que la contraseña original de esta cadena, ¿verdad?

263
00:14:46,680 --> 00:14:48,150
‫Así que ese

264
00:14:48,150 --> 00:14:50,550
‫es el objetivo de cifrar una contraseña.

265
00:14:50,550 --> 00:14:52,410
‫Entonces, la única

266
00:14:52,410 --> 00:14:54,890
‫forma de hacerlo es que este

267
00:14:54,890 --> 00:14:58,100
‫paquete para este algoritmo encripte esta contraseña

268
00:14:58,100 --> 00:15:02,210
‫también y luego la compare con la encriptada, ¿de acuerdo?

269
00:15:02,210 --> 00:15:05,110
‫Así que implementemos una función que hará

270
00:15:05,110 --> 00:15:08,350
‫eso, y para eso usaremos, nuevamente, el paquete bcrypt.

271
00:15:08,350 --> 00:15:11,280
‫Y lo haremos en el modelo de usuario.

272
00:15:11,280 --> 00:15:13,767
‫Y podría preguntar "Por qué lo estamos haciendo

273
00:15:13,767 --> 00:15:16,310
‫en un modelo" y no solo aquí ", pero

274
00:15:16,310 --> 00:15:19,730
‫eso es, nuevamente, porque esto está realmente relacionado con los datos en sí.

275
00:15:19,730 --> 00:15:22,930
‫Y también ya tenemos ese paquete allí, por lo

276
00:15:22,930 --> 00:15:26,090
‫que es más fácil simplemente hacerlo allí.

277
00:15:26,090 --> 00:15:28,663
‫Así que eliminemos esta cadena y luego creemos

278
00:15:30,600 --> 00:15:32,360
‫una función aquí, que

279
00:15:32,360 --> 00:15:34,580
‫verificará si la contraseña dada es

280
00:15:34,580 --> 00:15:37,473
‫la misma que la almacenada en el documento.

281
00:15:38,520 --> 00:15:41,100
‫Entonces, por primera vez, crearemos algo

282
00:15:41,100 --> 00:15:43,000
‫llamado método de instancia.

283
00:15:43,000 --> 00:15:46,120
‫Entonces, un método de instancia es básicamente un método

284
00:15:46,120 --> 00:15:48,500
‫que estará disponible en todos los documentos

285
00:15:48,500 --> 00:15:50,843
‫de una determinada colección, ¿de acuerdo?

286
00:15:51,680 --> 00:15:53,320
‫Y funciona así.

287
00:15:53,320 --> 00:15:56,120
‫Entonces, nuevamente, está definido en

288
00:15:56,120 --> 00:16:01,050
‫un userSchema, y luego decimos métodos, y ahora, en este

289
00:16:01,050 --> 00:16:05,273
‫caso, queremos llamar a la función correctPassword, ¿de acuerdo?

290
00:16:10,340 --> 00:16:12,810
‫Entonces función, ahora esta función aceptará una contraseña

291
00:16:12,810 --> 00:16:14,470
‫candidata, entonces la contraseña que

292
00:16:17,734 --> 00:16:19,650
‫el usuario pasa en el cuerpo,

293
00:16:19,650 --> 00:16:22,347
‫y luego también la contraseña de usuario, ¿de acuerdo?

294
00:16:26,010 --> 00:16:28,590
‫Ahora, dentro de estos métodos instanciados,

295
00:16:28,590 --> 00:16:31,470
‫dado que están disponibles en el documento,

296
00:16:31,470 --> 00:16:35,430
‫la palabra clave this en realidad apunta al documento actual.

297
00:16:35,430 --> 00:16:37,610
‫Pero en este caso, dado

298
00:16:37,610 --> 00:16:42,080
‫que tenemos la contraseña configurada para seleccionar falsa, esto aquí, ¿recuerdas?

299
00:16:42,080 --> 00:16:43,690
‫Está bien,

300
00:16:43,690 --> 00:16:47,920
‫y por eso, esto. la contraseña no estará disponible.

301
00:16:47,920 --> 00:16:50,780
‫Entonces, idealmente lo haríamos así, y de esta

302
00:16:50,780 --> 00:16:52,360
‫manera solo necesitaríamos

303
00:16:52,360 --> 00:16:56,130
‫pasar la contraseña candidata y no la contraseña de usuario.

304
00:16:56,130 --> 00:16:58,690
‫Pero nuevamente, en este momento eso no

305
00:16:58,690 --> 00:17:02,350
‫es posible porque la contraseña no está disponible en la salida.

306
00:17:02,350 --> 00:17:03,420
‫Y es

307
00:17:03,420 --> 00:17:06,380
‫por eso que también tenemos que pasar userPassword.

308
00:17:06,380 --> 00:17:07,890
‫Entonces, el objetivo

309
00:17:07,890 --> 00:17:11,030
‫de esta función es devolver solo verdadero o falso.

310
00:17:11,030 --> 00:17:14,000
‫Así que básicamente es cierto si las contraseñas son las

311
00:17:14,000 --> 00:17:15,663
‫mismas y falso si no.

312
00:17:16,560 --> 00:17:21,410
‫Entonces regrese, y luego bcrypt que ya conocemos, y

313
00:17:21,410 --> 00:17:26,257
‫luego usaremos la función de comparación, ¿de acuerdo?

314
00:17:26,257 --> 00:17:29,190
‫Y la función de comparación es

315
00:17:29,190 --> 00:17:32,200
‫realmente fácil, todo lo que necesitamos es

316
00:17:32,200 --> 00:17:37,060
‫pasar el candidatoPassword y el userPassword, no userSchema, userPassword, ¿de acuerdo?

317
00:17:39,270 --> 00:17:42,090
‫Y al igual que la función

318
00:17:42,090 --> 00:17:45,383
‫hash aquí arriba, esta también es una función asincrónica.

319
00:17:46,270 --> 00:17:50,973
‫Y así, al igual que antes, usamos await, y luego aquí async.

320
00:17:53,330 --> 00:17:54,940
‫Vale, ¿tiene sentido?

321
00:17:54,940 --> 00:17:57,630
‫Entonces, nuevamente, esta función de comparación

322
00:17:57,630 --> 00:17:59,800
‫aquí simplemente devolverá verdadero

323
00:17:59,800 --> 00:18:04,470
‫si estas dos contraseñas aquí son iguales, y falso si no.

324
00:18:04,470 --> 00:18:07,030
‫Y nuevamente, no podemos compararlos

325
00:18:07,030 --> 00:18:10,020
‫manualmente porque la contraseña candidata no tiene hash,

326
00:18:10,020 --> 00:18:12,800
‫por lo que es la contraseña original

327
00:18:12,800 --> 00:18:15,580
‫que proviene del usuario, pero userPassword, por

328
00:18:15,580 --> 00:18:18,230
‫supuesto, está hash, por lo que sin

329
00:18:18,230 --> 00:18:21,830
‫esta función aquí no tendríamos forma de compararlos, ¿de acuerdo?

330
00:18:21,830 --> 00:18:23,990
‫Entonces aquí devolvemos verdadero o falso, ahora

331
00:18:23,990 --> 00:18:26,893
‫todo lo que tenemos que hacer es llamar a

332
00:18:26,893 --> 00:18:28,633
‫esta función en el authController.

333
00:18:29,920 --> 00:18:31,873
‫Cerremos un par de estos.

334
00:18:34,080 --> 00:18:38,253
‫Muy bien, esto de aquí fue solo para una demostración.

335
00:18:41,400 --> 00:18:43,563
‫Así que simplemente llamemos a esto aquí

336
00:18:44,400 --> 00:18:47,110
‫correcto, y ahora recordemos que la función que acabamos de

337
00:18:47,110 --> 00:18:48,670
‫definir es un método instanciado.

338
00:18:48,670 --> 00:18:52,260
‫Por tanto, está disponible en todos los documentos de usuario.

339
00:18:52,260 --> 00:18:54,780
‫Entonces, esta variable aquí ahora mismo es

340
00:18:54,780 --> 00:18:57,050
‫un documento de usuario, ¿verdad?

341
00:18:57,050 --> 00:19:00,270
‫Porque es el resultado de consultar el modelo de usuario.

342
00:19:00,270 --> 00:19:03,637
‫Y ahora podemos decir usuario. correctPassword.

343
00:19:06,760 --> 00:19:10,650
‫Ahora todo lo que tenemos que hacer es pasar la contraseña del

344
00:19:10,650 --> 00:19:13,020
‫candidato, que es la contraseña, recuerde.

345
00:19:13,020 --> 00:19:17,830
‫Entonces este de aquí, y luego el userPassword.

346
00:19:17,830 --> 00:19:22,830
‫Y eso está en user. contraseña, ¿de acuerdo?

347
00:19:23,450 --> 00:19:26,373
‫Y entonces esto aquí ahora será verdadero o falso.

348
00:19:27,990 --> 00:19:30,810
‫Muy bien, y ahora usemos estas dos variables

349
00:19:30,810 --> 00:19:33,500
‫para averiguar si el usuario existe y

350
00:19:33,500 --> 00:19:35,200
‫la contraseña es correcta.

351
00:19:35,200 --> 00:19:36,710
‫Así que ya nos

352
00:19:36,710 --> 00:19:40,390
‫dimos cuenta de eso, pero ahora necesitamos escribir nuestra declaración if.

353
00:19:40,390 --> 00:19:45,390
‫Entonces, si no hay un usuario, o la contraseña es incorrecta, entonces básicamente

354
00:19:46,160 --> 00:19:49,853
‫correcto es falso, que es lo que esto significa.

355
00:19:50,860 --> 00:19:54,590
‫En ese caso, queremos, nuevamente, regresar e ir

356
00:19:54,590 --> 00:19:58,640
‫directamente a nuestro próximo middleware con un nuevo

357
00:19:58,640 --> 00:19:59,640
‫AppError.

358
00:20:00,980 --> 00:20:05,973
‫Y en este caso decir correo electrónico o contraseña incorrectos, ¿de acuerdo?

359
00:20:08,990 --> 00:20:11,560
‫Y luego el código de estado

360
00:20:11,560 --> 00:20:14,870
‫es 401, lo que significa no autorizado, ¿de acuerdo?

361
00:20:14,870 --> 00:20:16,910
‫Ahora podríamos haber hecho esto por

362
00:20:16,910 --> 00:20:18,847
‫separado, así que primero verificamos

363
00:20:18,847 --> 00:20:21,440
‫al usuario y luego verificamos la contraseña correcta.

364
00:20:21,440 --> 00:20:24,600
‫Pero en ese caso, le daríamos a un posible

365
00:20:24,600 --> 00:20:28,710
‫atacante información sobre si el correo electrónico o la contraseña son incorrectos.

366
00:20:28,710 --> 00:20:31,550
‫Y de esta manera aquí es un poco más vago.

367
00:20:31,550 --> 00:20:34,830
‫Así que no estamos especificando realmente qué es incorrecto aquí.

368
00:20:34,830 --> 00:20:37,060
‫Entonces, si es correo electrónico o si es la contraseña.

369
00:20:37,060 --> 00:20:38,700
‫Entonces, si algún atacante

370
00:20:38,700 --> 00:20:41,150
‫intenta ingresar datos aleatorios, entonces no sabrá

371
00:20:41,150 --> 00:20:43,640
‫si el correo electrónico existe realmente, o

372
00:20:43,640 --> 00:20:47,143
‫si es solo la contraseña la que está mal, ¿de acuerdo?

373
00:20:47,990 --> 00:20:50,860
‫Ahora solo dos cosas aquí, y la

374
00:20:50,860 --> 00:20:53,140
‫primera es que realmente necesitamos

375
00:20:53,140 --> 00:20:55,480
‫esperar esta función asincrónica, ¿de acuerdo?

376
00:20:55,480 --> 00:20:57,470
‫Así que recuerde que la contraseña correcta

377
00:20:57,470 --> 00:20:59,000
‫es una función asincrónica, por

378
00:20:59,000 --> 00:21:01,333
‫lo que aquí también debemos esperar por eso.

379
00:21:02,690 --> 00:21:04,530
‫Y luego también hay otro problema,

380
00:21:04,530 --> 00:21:06,980
‫debido a que este usuario no existe aquí,

381
00:21:06,980 --> 00:21:10,950
‫entonces esta siguiente línea de código realmente no se puede ejecutar, ¿de acuerdo?

382
00:21:10,950 --> 00:21:13,550
‫Porque, por ejemplo, user. la contraseña

383
00:21:13,550 --> 00:21:15,400
‫no estará disponible.

384
00:21:15,400 --> 00:21:18,800
‫Entonces, en realidad, necesitamos mover todo esto, o en

385
00:21:18,800 --> 00:21:20,690
‫realidad solo este código,

386
00:21:20,690 --> 00:21:24,343
‫lo vamos a mover aquí a la declaración if else.

387
00:21:26,740 --> 00:21:29,000
‫Muy bien, y de esta manera, si

388
00:21:29,000 --> 00:21:32,550
‫el usuario no existe, entonces si esto es cierto, entonces

389
00:21:32,550 --> 00:21:34,900
‫ni siquiera ejecutará este código aquí, y

390
00:21:34,900 --> 00:21:37,070
‫entonces no habrá ningún problema.

391
00:21:37,070 --> 00:21:40,510
‫Pero si el usuario existe, también ejecutará este código

392
00:21:40,510 --> 00:21:43,600
‫y comprobará si la contraseña es correcta.

393
00:21:43,600 --> 00:21:45,520
‫Entonces, si la contraseña

394
00:21:45,520 --> 00:21:50,010
‫es correcta, solo en ese caso llegaremos a este código aquí.

395
00:21:50,010 --> 00:21:52,710
‫Entonces esa es toda la idea de esta función.

396
00:21:52,710 --> 00:21:55,030
‫Básicamente, buscamos los negativos.

397
00:21:55,030 --> 00:21:57,270
‫Entonces, si no hay correo electrónico ni

398
00:21:57,270 --> 00:21:58,880
‫contraseña, obtenemos este error.

399
00:21:58,880 --> 00:22:01,690
‫Si no hay ningún usuario o si hay una

400
00:22:01,690 --> 00:22:03,540
‫contraseña incorrecta, cree este error.

401
00:22:03,540 --> 00:22:05,610
‫Pero si no hubo ningún error,

402
00:22:05,610 --> 00:22:09,060
‫bueno, en ese caso llegamos a esta parte del código,

403
00:22:09,060 --> 00:22:10,820
‫donde ahora generamos un

404
00:22:10,820 --> 00:22:13,490
‫token y luego se lo enviamos al usuario.

405
00:22:13,490 --> 00:22:16,740
‫Ahora, crear este token será exactamente lo mismo

406
00:22:16,740 --> 00:22:18,500
‫que hicimos antes aquí.

407
00:22:18,500 --> 00:22:20,780
‫Entonces, en lugar de repetir

408
00:22:20,780 --> 00:22:24,210
‫todo este código, creemos una función para esto, ¿de acuerdo?

409
00:22:24,210 --> 00:22:25,840
‫Así que voy

410
00:22:25,840 --> 00:22:29,427
‫a copiar este código, y luego aquí muy rápidamente

411
00:22:31,900 --> 00:22:36,090
‫const signToken, que recibirá como única entrada la ID de usuario.

412
00:22:36,090 --> 00:22:41,090
‫Entonces ID, y luego devolverá el token, ¿de acuerdo?

413
00:22:43,370 --> 00:22:46,793
‫Así que simplemente lo firmará y lo devolverá de inmediato.

414
00:22:47,700 --> 00:22:50,920
‫Muy bien, y aquí lo

415
00:22:50,920 --> 00:22:55,920
‫que vamos a hacer es firmar y pasar esta identificación.

416
00:23:04,970 --> 00:23:09,330
‫Y luego, por supuesto, también tenemos que cambiarlo aquí, ¿de acuerdo?

417
00:23:09,330 --> 00:23:11,750
‫Por lo tanto, establezca esta ID en esta ID,

418
00:23:11,750 --> 00:23:14,893
‫que, como ya sabe en este momento, es la misma que esta.

419
00:23:15,950 --> 00:23:19,763
‫Muy bien, entonces sigamos adelante y hagamos lo mismo aquí.

420
00:23:22,547 --> 00:23:26,340
‫signToken, y luego en este caso es user. _identificación.

421
00:23:31,300 --> 00:23:33,910
‫Uf, esa fue una

422
00:23:33,910 --> 00:23:37,090
‫conferencia larga, ahora sigamos adelante y probémosla.

423
00:23:37,090 --> 00:23:38,363
‫Entonces ahora debería funcionar.

424
00:23:39,250 --> 00:23:43,470
‫Así que recuerde, bueno, este es ahora otro usuario, pero sé que

425
00:23:43,470 --> 00:23:46,030
‫esta es la contraseña que usé.

426
00:23:46,030 --> 00:23:48,580
‫Así que, por ahora, usemos

427
00:23:48,580 --> 00:23:52,003
‫otro, así que solo prueba12 y veamos qué sucede.

428
00:23:53,540 --> 00:23:57,450
‫Esperemos, y de hecho, correo electrónico o contraseña incorrectos.

429
00:23:57,450 --> 00:24:00,230
‫Y así obtenemos, por supuesto, también nuestro

430
00:24:00,230 --> 00:24:04,600
‫401, y de hecho significa que nuestro código ya está probando

431
00:24:04,600 --> 00:24:05,933
‫la contraseña.

432
00:24:06,780 --> 00:24:10,230
‫Entonces, si ahora elegimos la contraseña correcta,

433
00:24:10,230 --> 00:24:12,793
‫debería pasar, así que esperemos.

434
00:24:13,760 --> 00:24:16,760
‫Pero seguimos recibiendo este error.

435
00:24:16,760 --> 00:24:20,453
‫Bueno, simplemente eliminémonos de todos nuestros usuarios aquí, solo para

436
00:24:22,170 --> 00:24:24,420
‫asegurarnos de que no tenga que

437
00:24:24,420 --> 00:24:28,740
‫hacer nada con los usuarios, y luego creemos uno nuevo, de acuerdo.

438
00:24:33,080 --> 00:24:37,473
‫Así que hola @ jonas, y pasa1234.

439
00:24:38,710 --> 00:24:42,373
‫Sigamos adelante y copiemos, lo enviaré ahora.

440
00:24:46,800 --> 00:24:50,070
‫Y estas credenciales ahora son correctas con seguridad.

441
00:24:50,070 --> 00:24:52,760
‫Entonces, si ahora no funciona, hay algún tipo de error.

442
00:24:52,760 --> 00:24:55,870
‫Pero ahora realmente funcionó, genial.

443
00:24:55,870 --> 00:25:00,090
‫Entonces, aquí está nuestro token, y se ve exactamente como antes, por lo

444
00:25:00,090 --> 00:25:02,483
‫que podemos asumir que es correcto.

445
00:25:03,570 --> 00:25:06,333
‫Ahora intentémoslo de nuevo, eliminando esto, está bien.

446
00:25:07,810 --> 00:25:10,753
‫Y así, con la contraseña incorrecta, no funciona.

447
00:25:11,890 --> 00:25:15,423
‫Pongamos ahora la contraseña correcta y el correo electrónico incorrecto, y luego

448
00:25:18,230 --> 00:25:19,730
‫obtenemos el mismo error.

449
00:25:19,730 --> 00:25:21,883
‫Correo electrónico o contraseña incorrectos.

450
00:25:22,930 --> 00:25:25,560
‫Y nuevamente, si devolvemos todo, obtenemos

451
00:25:25,560 --> 00:25:27,560
‫una nueva ficha.

452
00:25:27,560 --> 00:25:30,810
‫Y ahora estamos realmente conectados a la aplicación.

453
00:25:30,810 --> 00:25:33,580
‫Y sé que esto puede parecer algo abstracto, por

454
00:25:33,580 --> 00:25:37,340
‫lo que todo lo que realmente obtenemos es un token, y eso

455
00:25:37,340 --> 00:25:40,020
‫significa que estamos conectados a la aplicación, ¿verdad?

456
00:25:40,020 --> 00:25:44,720
‫Pero, bueno, así es como funciona la autenticación sin estado.

457
00:25:44,720 --> 00:25:47,810
‫Más adelante, cuando realmente creemos el sitio web

458
00:25:47,810 --> 00:25:50,190
‫dinámico, entonces, por supuesto, será mucho

459
00:25:50,190 --> 00:25:53,900
‫más visible si el usuario está conectado o desconectado, ¿verdad?

460
00:25:53,900 --> 00:25:55,920
‫Pero seguirá funcionando detrás de escena

461
00:25:55,920 --> 00:25:57,670
‫usando este mismo token.

462
00:25:57,670 --> 00:26:01,560
‫Entonces, si no hay un token, entonces el sitio web se verá de una

463
00:26:01,560 --> 00:26:03,800
‫manera, y si hay un token, el

464
00:26:03,800 --> 00:26:06,630
‫sitio web se verá de otra manera, con la

465
00:26:06,630 --> 00:26:11,150
‫imagen del usuario y el nombre de usuario allí mismo en el sitio web, por ejemplo.

466
00:26:11,150 --> 00:26:13,373
‫De todos modos, esta fue una conferencia bastante larga.

467
00:26:14,370 --> 00:26:17,100
‫Asegúrate de volver aquí y de intentar

468
00:26:17,100 --> 00:26:20,210
‫comprender todo este código que tenemos aquí, ¿de acuerdo?

469
00:26:20,210 --> 00:26:21,870
‫Porque sé que algo de

470
00:26:21,870 --> 00:26:23,660
‫esto puede resultar un poco confuso.

471
00:26:23,660 --> 00:26:26,963
‫Por ejemplo, esta función correctPassword aquí.

472
00:26:27,850 --> 00:26:30,933
‫Y luego estoy seguro de que todo tendrá sentido para ti.

