﻿1
00:00:01,210 --> 00:00:04,650
‫Instructor: Y ahora, finalmente creemos la última parte de

2
00:00:04,650 --> 00:00:07,010
‫la funcionalidad de restablecimiento de

3
00:00:07,010 --> 00:00:10,593
‫contraseña, donde realmente establecemos la nueva contraseña para el usuario.

4
00:00:12,250 --> 00:00:15,900
‫Y así, como antes, comencemos por definir los

5
00:00:15,900 --> 00:00:19,713
‫pasos que vamos a tomar para este flujo de resetPassword.

6
00:00:21,240 --> 00:00:26,240
‫Entonces, en primer lugar, obtenga el usuario según el token.

7
00:00:30,350 --> 00:00:35,350
‫Luego, como segundo paso, estableceremos la nueva contraseña, pero

8
00:00:35,890 --> 00:00:40,153
‫solo si el token no ha expirado y

9
00:00:42,070 --> 00:00:44,040
‫hay un usuario.

10
00:00:44,040 --> 00:00:48,633
‫Entonces, en ese caso, configure la nueva contraseña.

11
00:00:51,580 --> 00:00:55,250
‫Luego, después de eso, necesitamos actualizar la propiedad

12
00:00:57,210 --> 00:01:01,000
‫modifiedPasswordAt para el usuario actual, y finalmente, como

13
00:01:04,080 --> 00:01:05,403
‫es habitual en

14
00:01:07,320 --> 00:01:10,533
‫esta funcionalidad, es iniciar la sesión del

15
00:01:11,680 --> 00:01:12,853
‫usuario.

16
00:01:14,010 --> 00:01:18,840
‫Básicamente, envíe el JSON Web Token al cliente.

17
00:01:18,840 --> 00:01:22,733
‫Bien, mucho trabajo por hacer, así que comencemos.

18
00:01:23,950 --> 00:01:27,493
‫Y entonces, recuerde del último video, que el token de

19
00:01:27,493 --> 00:01:30,450
‫restablecimiento que se envía realmente en la URL

20
00:01:30,450 --> 00:01:33,110
‫es este token no cifrado aquí.

21
00:01:33,110 --> 00:01:34,723
‫Entonces, en realidad este.

22
00:01:35,570 --> 00:01:37,810
‫Pero el que tenemos en la base

23
00:01:37,810 --> 00:01:39,680
‫de datos es el cifrado.

24
00:01:39,680 --> 00:01:42,580
‫Así que hablamos de eso antes, y lo que ahora

25
00:01:42,580 --> 00:01:44,910
‫tenemos que hacer es básicamente encriptar el token

26
00:01:44,910 --> 00:01:46,630
‫original nuevamente, para luego

27
00:01:46,630 --> 00:01:49,240
‫compararlo con el que está almacenado, por lo que

28
00:01:49,240 --> 00:01:51,433
‫el encriptado en la base de datos.

29
00:01:52,870 --> 00:01:55,110
‫Entonces, en realidad hicimos algo similar antes

30
00:01:55,110 --> 00:01:57,890
‫con la contraseña, pero con la contraseña, no

31
00:01:57,890 --> 00:02:01,010
‫pudimos compararla tan fácilmente como pudimos con esta, nuevamente

32
00:02:01,010 --> 00:02:02,650
‫porque para la contraseña

33
00:02:02,650 --> 00:02:05,770
‫usamos el algoritmo bcrypt bastante complejo, que en este

34
00:02:05,770 --> 00:02:07,490
‫caso, nosotros no lo hicimos.

35
00:02:07,490 --> 00:02:09,750
‫Entonces, aquí es muy sencillo.

36
00:02:09,750 --> 00:02:13,040
‫Todo lo que tenemos que hacer de nuevo es

37
00:02:13,040 --> 00:02:17,390
‫cifrar el token y compararlo con el cifrado en la base de datos.

38
00:02:17,390 --> 00:02:22,390
‫Entonces, digamos hashedToken, por lo que ahora también

39
00:02:23,670 --> 00:02:26,813
‫necesitaremos el paquete criptográfico aquí.

40
00:02:31,730 --> 00:02:36,167
‫Const crypto y luego require ('crypto').

41
00:02:41,280 --> 00:02:42,123
‫Ahora a la derecha.

42
00:02:43,780 --> 00:02:47,593
‫Entonces volvamos, y entonces usamos

43
00:02:48,750 --> 00:02:51,610
‫criptografía. createHash.

44
00:02:53,070 --> 00:02:57,973
‫Recuerde, luego el nombre del algoritmo

45
00:02:58,910 --> 00:03:03,910
‫nuevamente, sha256, luego. actualizar, básicamente para el lugar, para la

46
00:03:04,140 --> 00:03:06,040
‫cadena que queremos hash.

47
00:03:06,040 --> 00:03:10,110
‫Y entonces, ese es, recuerde en req. params.

48
00:03:10,110 --> 00:03:14,083
‫Entonces usamos este durante mucho tiempo. simbólico.

49
00:03:15,060 --> 00:03:17,950
‫Y de nuevo, es un

50
00:03:17,950 --> 00:03:22,233
‫parámetro, porque lo especificamos aquí en la URL, así.

51
00:03:23,250 --> 00:03:26,470
‫Entonces, ahora es un parámetro llamado token.

52
00:03:26,470 --> 00:03:31,470
‫Y entonces, por supuesto, aquí es req. params. simbólico.

53
00:03:31,804 --> 00:03:34,790
‫Y luego, finalmente, también necesitamos decir digerir

54
00:03:36,840 --> 00:03:38,633
‫y convertirlo a hexadecimal.

55
00:03:40,380 --> 00:03:42,760
‫Ahora, esto es básicamente lo mismo

56
00:03:42,760 --> 00:03:46,180
‫que teníamos antes, donde encriptamos el original, y así

57
00:03:46,180 --> 00:03:49,520
‫podríamos refactorizar esto en su propia función, pero mantengamos

58
00:03:49,520 --> 00:03:51,693
‫las cosas simples aquí.

59
00:03:54,240 --> 00:03:58,930
‫Entonces, ahora obtengamos al usuario en función de este token.

60
00:03:58,930 --> 00:04:01,060
‫Porque eso es, en realidad, lo

61
00:04:01,060 --> 00:04:03,530
‫único que sabemos sobre el usuario en este momento.

62
00:04:03,530 --> 00:04:07,080
‫No tenemos correo electrónico, no tenemos nada, por lo que este

63
00:04:07,080 --> 00:04:10,130
‫token es lo único que puede identificar al usuario.

64
00:04:10,130 --> 00:04:12,520
‫Y ahora podemos, básicamente, consultar la base de

65
00:04:12,520 --> 00:04:14,170
‫datos para este token.

66
00:04:14,170 --> 00:04:17,303
‫Y luego encontrará al usuario que tiene este token.

67
00:04:19,230 --> 00:04:24,230
‫Entonces, espere, como ya sabemos, y luego Usuario. Encuentra uno.

68
00:04:27,790 --> 00:04:31,213
‫Entonces, esa propiedad se llama

69
00:04:32,090 --> 00:04:36,117
‫passwordResetToken y estamos buscando el hashToken.

70
00:04:37,940 --> 00:04:42,220
‫Y ahora, por supuesto, debemos declararlo como asíncrono y

71
00:04:43,150 --> 00:04:44,643
‫prepararlo en catchAsync.

72
00:04:48,557 --> 00:04:51,810
‫Salvarlo, eso debería solucionar este error, y

73
00:04:51,810 --> 00:04:53,950
‫de hecho lo hace.

74
00:04:53,950 --> 00:04:56,950
‫Entonces, esto encontrará al usuario que tiene el token que

75
00:04:56,950 --> 00:04:59,100
‫enviará a través de la URL.

76
00:04:59,100 --> 00:05:00,910
‫Pero, en este momento, no

77
00:05:00,910 --> 00:05:04,090
‫estamos tomando en consideración la fecha de vencimiento del token.

78
00:05:04,090 --> 00:05:06,000
‫¿Y cómo podríamos hacer eso?

79
00:05:06,000 --> 00:05:09,020
‫Bueno, básicamente, lo que queremos es comprobar

80
00:05:09,020 --> 00:05:11,860
‫si la propiedad passwordResetExpires es mayor que

81
00:05:11,860 --> 00:05:13,723
‫en este momento.

82
00:05:14,890 --> 00:05:17,350
‫Porque si la fecha de vencimiento es mayor que

83
00:05:17,350 --> 00:05:20,420
‫ahora, significa que está en el futuro, lo que a su vez

84
00:05:20,420 --> 00:05:22,313
‫significa que aún no ha vencido.

85
00:05:23,180 --> 00:05:24,850
‫Entonces, esa es una manera

86
00:05:24,850 --> 00:05:28,343
‫muy fácil en la que realmente podemos hacer esto bien con esta consulta.

87
00:05:30,619 --> 00:05:32,702
‫Entonces, passwordResetExpires, que es donde se

88
00:05:35,170 --> 00:05:37,460
‫almacena esa fecha, y ahora todo

89
00:05:37,460 --> 00:05:38,840
‫lo que necesitamos

90
00:05:38,840 --> 00:05:41,470
‫para verificar si es realmente mayor que ahora.

91
00:05:41,470 --> 00:05:45,440
‫Y entonces ya sabemos cómo hacer eso con MongoDB, ¿verdad?

92
00:05:45,440 --> 00:05:50,110
‫Entonces, nuevo objeto y luego el operador mayor y luego con lo que

93
00:05:50,110 --> 00:05:53,737
‫queremos compararlo es Fecha. ahora, y esta será

94
00:05:56,310 --> 00:05:59,410
‫una marca de tiempo de ahora, pero

95
00:05:59,410 --> 00:06:02,900
‫detrás de escena, MongoDB convertirá todo a lo mismo

96
00:06:02,900 --> 00:06:05,170
‫y, por lo tanto, podrá compararlos

97
00:06:05,170 --> 00:06:06,520
‫con precisión.

98
00:06:08,070 --> 00:06:10,440
‫Y así, con esto podemos, al mismo

99
00:06:10,440 --> 00:06:14,120
‫tiempo, encontrar el usuario del token y también verificar si el

100
00:06:14,120 --> 00:06:16,370
‫token aún no ha caducado.

101
00:06:16,370 --> 00:06:18,190
‫Que bien.

102
00:06:18,190 --> 00:06:21,190
‫Entonces, a continuación queremos, por supuesto, enviar un

103
00:06:21,190 --> 00:06:25,530
‫error si no hay ningún usuario, o básicamente, si el token ha expirado.

104
00:06:25,530 --> 00:06:27,230
‫Pero eso es, en

105
00:06:27,230 --> 00:06:30,500
‫este caso, lo mismo, porque si el token ha expirado,

106
00:06:30,500 --> 00:06:32,513
‫entonces simplemente no devolverá ningún usuario.

107
00:06:33,956 --> 00:06:37,730
‫Entonces, todo lo que tenemos que hacer es decir,

108
00:06:38,970 --> 00:06:43,970
‫si no hay usuario, bueno, como siempre, regrese a continuación, eso no es mext.

109
00:06:47,920 --> 00:06:51,910
‫Entonces, nuevo AppError, y digamos que

110
00:06:51,910 --> 00:06:56,793
‫el token no es válido o ha caducado.

111
00:06:59,850 --> 00:07:02,853
‫Y luego 400, tan mala solicitud.

112
00:07:04,140 --> 00:07:07,050
‫Entonces, si no hay ningún error, y

113
00:07:07,050 --> 00:07:09,400
‫si no se llama

114
00:07:09,400 --> 00:07:12,160
‫a next, entonces establezcamos la contraseña.

115
00:07:12,160 --> 00:07:15,550
‫Entonces, ya tenemos el usuario y ahora es muy

116
00:07:15,550 --> 00:07:20,550
‫simple: usuario. contraseña es igual a req. cuerpo. contraseña.

117
00:07:24,880 --> 00:07:28,140
‫Y eso es porque, por supuesto, enviaremos la

118
00:07:28,140 --> 00:07:31,713
‫contraseña y también la contraseñaConfirmar a través del cuerpo.

119
00:07:33,551 --> 00:07:34,701
‫Así que

120
00:07:37,870 --> 00:07:39,553
‫dupliquemos eso y también passwordConfirm.

121
00:07:41,425 --> 00:07:44,630
‫Y luego también, básicamente eliminemos el token de reinicio

122
00:07:44,630 --> 00:07:45,733
‫y el caducado.

123
00:07:46,800 --> 00:07:51,800
‫Entonces passwordResetToken, así como lo hicimos antes, lo configuramos como

124
00:07:52,040 --> 00:07:57,037
‫indefinido, y ahora usuario. la contraseña expira es igual

125
00:07:59,510 --> 00:08:01,160
‫a indefinida.

126
00:08:01,160 --> 00:08:02,220
‫Está bien.

127
00:08:02,220 --> 00:08:04,350
‫Y nuevamente, por supuesto, ahora necesitamos guardarlo,

128
00:08:04,350 --> 00:08:07,000
‫porque esto solo modifica el documento, en realidad

129
00:08:07,000 --> 00:08:08,410
‫no se actualiza.

130
00:08:08,410 --> 00:08:09,973
‫Entonces realmente no lo salva.

131
00:08:11,200 --> 00:08:15,503
‫Entonces, espera al usuario. ahorrar.

132
00:08:17,500 --> 00:08:20,350
‫Y en este caso, en realidad no

133
00:08:20,350 --> 00:08:24,340
‫tenemos que apagar los validadores, porque de hecho queremos validar.

134
00:08:24,340 --> 00:08:27,620
‫Por ejemplo, queremos que el validador

135
00:08:27,620 --> 00:08:31,440
‫confirme si la contraseña es igual a passwordConfirm.

136
00:08:31,440 --> 00:08:33,380
‫Y ese validador automáticamente hace todo

137
00:08:33,380 --> 00:08:35,033
‫ese trabajo por nosotros.

138
00:08:36,800 --> 00:08:39,390
‫Luego, el tercer paso, lo que haremos realmente

139
00:08:39,390 --> 00:08:42,030
‫al final, y lo que haremos a continuación

140
00:08:42,030 --> 00:08:43,990
‫es básicamente encerrar al usuario.

141
00:08:43,990 --> 00:08:47,400
‫En otras palabras, envíe el JSON Web Token.

142
00:08:47,400 --> 00:08:51,930
‫Y obtengamos ese código de aquí, así que este.

143
00:08:51,930 --> 00:08:53,770
‫Y nuevamente, ya estamos haciendo

144
00:08:53,770 --> 00:08:55,700
‫esto aquí en tres lugares diferentes.

145
00:08:55,700 --> 00:08:59,280
‫Así que aquí en el inicio de sesión, también en el registro,

146
00:08:59,280 --> 00:09:01,400
‫y ahora por tercera vez, aquí abajo.

147
00:09:01,400 --> 00:09:05,170
‫Y así, en algún momento en el futuro, lo refactorizaremos en

148
00:09:05,170 --> 00:09:06,383
‫su propia función.

149
00:09:07,230 --> 00:09:09,673
‫Pero por ahora, estamos bien así.

150
00:09:11,180 --> 00:09:14,743
‫Y entonces, vayamos ahora a probar esto.

151
00:09:16,710 --> 00:09:19,020
‫Entonces, este token de reinicio

152
00:09:19,020 --> 00:09:22,080
‫que teníamos antes ya venció, por lo

153
00:09:22,080 --> 00:09:24,640
‫que debemos solicitar uno nuevo, básicamente.

154
00:09:24,640 --> 00:09:29,490
‫Así que vayamos a Postman y optemos por nuestra ruta para olvidar la contraseña.

155
00:09:29,490 --> 00:09:32,120
‫Reduzcamos el desorden aquí y

156
00:09:32,120 --> 00:09:36,350
‫eliminemos todas estas pestañas abiertas que ya no

157
00:09:36,350 --> 00:09:37,500
‫necesitamos.

158
00:09:38,910 --> 00:09:41,150
‫En realidad, aquí vamos a necesitar esta

159
00:09:43,480 --> 00:09:45,270
‫prueba para restablecer la contraseña,

160
00:09:45,270 --> 00:09:48,210
‫porque recuerde, que esta en realidad recupera un JSON

161
00:09:48,210 --> 00:09:51,540
‫Web Token, por lo que queremos guardarlo en la variable de

162
00:09:51,540 --> 00:09:52,890
‫entorno, al igual

163
00:09:52,890 --> 00:09:54,830
‫que hicimos con todos los demás.

164
00:09:54,830 --> 00:09:58,373
‫Así que lo estoy haciendo ahora, solo para no olvidarlo.

165
00:10:00,550 --> 00:10:04,100
‫Muy bien, de todos modos, comencemos, básicamente,

166
00:10:04,100 --> 00:10:05,690
‫olvidando la contraseña.

167
00:10:05,690 --> 00:10:08,620
‫Entonces, enviar esa solicitud, que nuevamente, toma algunos

168
00:10:08,620 --> 00:10:10,750
‫tiempos debido al envío del

169
00:10:10,750 --> 00:10:14,947
‫correo electrónico, pero aquí vamos, y ahora vayamos a nuestro correo

170
00:10:16,880 --> 00:10:19,463
‫electrónico, y eso llegó hace unos segundos.

171
00:10:20,670 --> 00:10:24,890
‫Entonces, es esta, por supuesto, esta ficha.

172
00:10:24,890 --> 00:10:29,890
‫Así que vamos a agarrarlo, copiarlo y ahora de vuelta a Postman, lo

173
00:10:31,060 --> 00:10:34,303
‫usamos en Restablecer contraseña, como la URL.

174
00:10:35,750 --> 00:10:37,253
‫Vale, ¿tiene sentido?

175
00:10:38,250 --> 00:10:41,603
‫De nuevo, enviamos ese token directamente en la URL.

176
00:10:43,600 --> 00:10:45,730
‫Entonces aquí, especifiquemos el

177
00:10:45,730 --> 00:10:49,453
‫cuerpo, porque ahora, necesitamos especificar nuestra nueva contraseña.

178
00:10:53,720 --> 00:10:57,843
‫Entonces contraseña y digamos newpass.

179
00:11:01,650 --> 00:11:03,050
‫Y luego...

180
00:11:05,950 --> 00:11:07,450
‫Y aquí llamémoslo de

181
00:11:07,450 --> 00:11:10,263
‫otra manera, porque por ahora, realmente quiero ver un error.

182
00:11:11,480 --> 00:11:14,727
‫Y, por supuesto, esto se llama passwordConfirm.

183
00:11:17,360 --> 00:11:20,393
‫Entonces, veamos qué sucede cuando intentamos hacer esto.

184
00:11:23,240 --> 00:11:27,080
‫Esperemos y obtenemos que la contraseña es más corta

185
00:11:27,080 --> 00:11:29,640
‫que la longitud mínima permitida.

186
00:11:29,640 --> 00:11:34,480
‫Bien, cambiemos eso, 123, y aquí digamos 1234.

187
00:11:36,090 --> 00:11:37,740
‫Por eso quiero que sean diferentes.

188
00:11:37,740 --> 00:11:40,630
‫Pero ve que la validación aquí funcionó bien,

189
00:11:40,630 --> 00:11:43,273
‫incluso al actualizar la contraseña con guardar.

190
00:11:45,610 --> 00:11:48,800
‫Entonces, ¡y ahora obtenemos las contraseñas no son las mismas!

191
00:11:48,800 --> 00:11:50,960
‫De nuevo, eso es un error de validación.

192
00:11:50,960 --> 00:11:53,430
‫Y recuerde, en realidad, que esta es la

193
00:11:53,430 --> 00:11:56,213
‫razón por la que necesitamos usar guardar y no actualizar.

194
00:11:57,206 --> 00:11:59,090
‫Entonces, antes, para actualizar

195
00:11:59,090 --> 00:12:03,220
‫los recorridos, solíamos usar findOneAndUpdate, pero ahora, para todo lo

196
00:12:03,220 --> 00:12:06,820
‫relacionado con las contraseñas y el usuario, siempre

197
00:12:06,820 --> 00:12:10,110
‫usamos guardar, porque siempre queremos ejecutar todos los

198
00:12:10,110 --> 00:12:12,580
‫validadores y, sobre todo, las funciones

199
00:12:12,580 --> 00:12:14,450
‫de guardar middleware.

200
00:12:14,450 --> 00:12:18,293
‫Entonces, por ejemplo, aquellos en los que las contraseñas están encriptadas.

201
00:12:20,400 --> 00:12:21,610
‫Así que terminemos ahora.

202
00:12:21,610 --> 00:12:25,030
‫Oh, en realidad no lo corrigí, lo siento.

203
00:12:25,030 --> 00:12:28,230
‫Y ahora debería funcionar.

204
00:12:28,230 --> 00:12:32,870
‫Y, de hecho, logramos el éxito y obtenemos una nueva ficha.

205
00:12:32,870 --> 00:12:36,600
‫Genial, veamos si este token es realmente válido.

206
00:12:36,600 --> 00:12:40,973
‫Entonces, si podemos, obtenga todos los recorridos con este nuevo token.

207
00:12:43,870 --> 00:12:46,210
‫Y aquí vamos.

208
00:12:46,210 --> 00:12:51,000
‫Entonces, nuestro nuevo token realmente funciona, y ahora para este

209
00:12:51,000 --> 00:12:53,990
‫usuario, para hello @ jonas, estas

210
00:12:53,990 --> 00:12:56,190
‫dos propiedades deberían desaparecer.

211
00:12:56,190 --> 00:12:59,760
‫Entonces, la contraseña caduca y el token debería desaparecer,

212
00:12:59,760 --> 00:13:03,550
‫ya que, bueno, eso es lo que hicimos en nuestro código.

213
00:13:03,550 --> 00:13:06,760
‫Y entonces, sí, ya no están aquí.

214
00:13:06,760 --> 00:13:10,210
‫Ahora todo lo que tenemos que hacer es este paso que falta

215
00:13:10,210 --> 00:13:12,690
‫aquí, que es actualizar la propiedad passwordAt para

216
00:13:13,610 --> 00:13:14,773
‫este usuario actual.

217
00:13:15,680 --> 00:13:17,260
‫Pero eso no

218
00:13:17,260 --> 00:13:20,690
‫debería ser demasiado difícil, así que volvamos rápidamente al

219
00:13:20,690 --> 00:13:24,550
‫modelo de usuario, que es donde lo haremos usando middleware.

220
00:13:24,550 --> 00:13:26,800
‫Y realmente juntemos todo el middleware

221
00:13:26,800 --> 00:13:29,023
‫aquí en la parte superior.

222
00:13:32,241 --> 00:13:35,408
‫Entonces, userSchema. pre y de

223
00:13:38,830 --> 00:13:42,763
‫nuevo dot save, y luego una función con next.

224
00:13:44,850 --> 00:13:47,010
‫Nuevamente, esta función se ejecutará

225
00:13:47,010 --> 00:13:50,890
‫justo antes de que se guarde un nuevo documento.

226
00:13:50,890 --> 00:13:52,220
‫Por lo tanto,

227
00:13:52,220 --> 00:13:54,880
‫es el lugar perfecto para especificar esta propiedad.

228
00:13:54,880 --> 00:13:57,480
‫Y, por supuesto, podría haberlo hecho en un controlador

229
00:13:58,820 --> 00:14:01,133
‫justo al lado de este código, por ejemplo.

230
00:14:02,310 --> 00:14:05,853
‫Pero realmente quiero que esto suceda, algo así, automáticamente.

231
00:14:06,740 --> 00:14:08,700
‫Entonces, algo detrás de escena.

232
00:14:08,700 --> 00:14:11,350
‫Porque más adelante, tendremos otro lugar

233
00:14:11,350 --> 00:14:15,290
‫donde actualizaremos la contraseña y luego nos aseguraremos de incluir

234
00:14:15,290 --> 00:14:17,410
‫el mismo código allí.

235
00:14:17,410 --> 00:14:19,300
‫Y así, de nuevo, sucede, algo

236
00:14:19,300 --> 00:14:20,640
‫así, detrás de

237
00:14:20,640 --> 00:14:23,810
‫escena, sin que tengamos que preocuparnos por eso en absoluto.

238
00:14:23,810 --> 00:14:26,600
‫Ahora, ¿cuándo exactamente queremos

239
00:14:26,600 --> 00:14:30,630
‫establecer la propiedad passwordChangedAt en este momento?

240
00:14:30,630 --> 00:14:33,450
‫Bueno, solo lo queremos cuando realmente modificamos la propiedad

241
00:14:33,450 --> 00:14:34,660
‫de la contraseña.

242
00:14:34,660 --> 00:14:37,290
‫Y no estoy seguro si usamos este truco

243
00:14:37,290 --> 00:14:39,660
‫antes, pero de todos modos, usémoslo ahora.

244
00:14:39,660 --> 00:14:44,660
‫Entonces, si no lo hemos modificado, entonces si no este. isModified, así que así, y

245
00:14:47,620 --> 00:14:49,100
‫luego el

246
00:14:49,100 --> 00:14:53,070
‫nombre de la propiedad, por lo que contraseña.

247
00:14:53,070 --> 00:14:56,380
‫Entonces, en ese caso, regrese de inmediato y

248
00:14:57,270 --> 00:14:59,360
‫ejecute el siguiente middleware.

249
00:14:59,360 --> 00:15:02,823
‫De acuerdo, no así, sino así.

250
00:15:04,380 --> 00:15:07,770
‫Entonces, nuevamente, si no modificamos la propiedad

251
00:15:07,770 --> 00:15:08,770
‫de

252
00:15:08,770 --> 00:15:12,970
‫la contraseña, bueno, por supuesto, no manipule el passwordChangedAt.

253
00:15:12,970 --> 00:15:15,860
‫Pero, ¿qué pasa con la creación de un nuevo documento?

254
00:15:15,860 --> 00:15:18,010
‫Bueno, cuando creamos un nuevo

255
00:15:18,010 --> 00:15:20,150
‫documento, modificamos la

256
00:15:20,150 --> 00:15:24,350
‫contraseña y luego configuramos la propiedad passwordChangedAt, ¿verdad?

257
00:15:24,350 --> 00:15:27,260
‫Bueno, en la implementación actual lo haríamos.

258
00:15:27,260 --> 00:15:29,860
‫Pero hay algo más que podemos usar aquí.

259
00:15:29,860 --> 00:15:32,950
‫Entonces, básicamente, queremos salir de esta función de

260
00:15:32,950 --> 00:15:36,630
‫middleware de inmediato, si la contraseña no se ha modificado

261
00:15:36,630 --> 00:15:40,274
‫o si el documento es nuevo, y entonces podemos usar

262
00:15:40,274 --> 00:15:41,633
‫la propiedad isNew.

263
00:15:42,700 --> 00:15:46,210
‫Y nuevamente, esta es una de estas cosas muy buenas que

264
00:15:46,210 --> 00:15:48,290
‫se aprenden leyendo su documentación.

265
00:15:48,290 --> 00:15:52,010
‫Entonces, no puedo enfatizar lo suficiente lo importante que es leer

266
00:15:52,010 --> 00:15:55,160
‫realmente la documentación cuando necesitas algo que no puedes

267
00:15:55,160 --> 00:15:56,870
‫encontrar en ningún lado.

268
00:15:56,870 --> 00:15:59,010
‫Porque realmente hay tantas

269
00:15:59,010 --> 00:16:02,983
‫cosas ahí que es completamente imposible enseñar en un curso.

270
00:16:04,810 --> 00:16:08,500
‫De todos modos, si el código pasa esta

271
00:16:08,500 --> 00:16:10,830
‫verificación aquí, bueno, simplemente digamos

272
00:16:10,830 --> 00:16:14,217
‫esto. passwordChangedAt = Fecha. ahora.

273
00:16:18,660 --> 00:16:22,303
‫Y luego, llamamos a continuación.

274
00:16:23,640 --> 00:16:26,300
‫Ahora, en teoría, esto debería funcionar bien, pero

275
00:16:26,300 --> 00:16:27,590
‫en realidad, en

276
00:16:27,590 --> 00:16:30,160
‫la práctica, a veces ocurre un pequeño problema.

277
00:16:30,160 --> 00:16:33,580
‫Y ese problema es que, a veces, guardar en la base de

278
00:16:33,580 --> 00:16:37,440
‫datos es un poco más lento que emitir el JSON Web Token, por lo

279
00:16:37,440 --> 00:16:40,460
‫que la marca de tiempo de la contraseña cambiada a

280
00:16:40,460 --> 00:16:42,560
‫veces se establece un poco después

281
00:16:42,560 --> 00:16:45,280
‫de que se ha creado el JSON Web Token.

282
00:16:45,280 --> 00:16:48,000
‫Y eso hará que el usuario

283
00:16:48,000 --> 00:16:51,120
‫no pueda iniciar sesión con el nuevo token.

284
00:16:51,120 --> 00:16:54,570
‫Porque, recuerde, la única razón por la que esta marca de

285
00:16:54,570 --> 00:16:57,660
‫tiempo aquí realmente existe es para que podamos

286
00:16:57,660 --> 00:17:01,200
‫compararla con la marca de tiempo del JSON Web Token, ¿verdad?

287
00:17:01,200 --> 00:17:04,353
‫Entonces, solo para recordar, es, bueno,

288
00:17:05,930 --> 00:17:10,930
‫aquí mismo, donde verificamos si el usuario ha cambiado la contraseña

289
00:17:11,560 --> 00:17:15,170
‫después de que se emitió el token.

290
00:17:15,170 --> 00:17:18,920
‫Y así, aquí abajo, donde creamos este nuevo token

291
00:17:18,920 --> 00:17:21,010
‫en el restablecimiento de contraseña.

292
00:17:21,010 --> 00:17:24,170
‫Así que aquí mismo, recuerde, creamos este nuevo token

293
00:17:24,170 --> 00:17:27,770
‫y, de nuevo, a veces sucede que este token se crea

294
00:17:27,770 --> 00:17:31,500
‫un poco antes de que se haya creado realmente la marca

295
00:17:31,500 --> 00:17:33,960
‫de tiempo de la contraseña modificada.

296
00:17:33,960 --> 00:17:38,960
‫Entonces, solo necesitamos arreglar eso restando un segundo.

297
00:17:39,610 --> 00:17:42,733
‫Entonces, básicamente, mil milisegundos.

298
00:17:43,750 --> 00:17:47,670
‫Y entonces pondrá la contraseñaChangedA en un segundo en el pasado,

299
00:17:47,670 --> 00:17:50,840
‫está bien, lo que, por supuesto, no

300
00:17:50,840 --> 00:17:54,500
‫será 100% exacto, pero eso no es un problema en

301
00:17:54,500 --> 00:17:58,000
‫absoluto, porque un segundo aquí no hace ninguna diferencia.

302
00:17:58,000 --> 00:18:01,213
‫Es un truco pequeño, pero de nuevo, no hay problema.

303
00:18:02,190 --> 00:18:06,190
‫Por lo tanto, si coloca esta contraseñaChanged un segundo en el pasado, se

304
00:18:06,190 --> 00:18:08,920
‫asegurará de que el token siempre se cree después

305
00:18:08,920 --> 00:18:11,433
‫de que se haya cambiado la contraseña.

306
00:18:13,290 --> 00:18:15,800
‫Entonces, esto funciona ahora,

307
00:18:15,800 --> 00:18:18,380
‫pero como siempre, también probémoslo rápidamente.

308
00:18:18,380 --> 00:18:21,060
‫Bien, volvamos a Postman.

309
00:18:21,060 --> 00:18:23,990
‫Hagamos un nuevo restablecimiento de contraseña, o en realidad,

310
00:18:23,990 --> 00:18:26,060
‫eso no es lo que quería

311
00:18:26,060 --> 00:18:28,400
‫en absoluto, pero es genial ver que

312
00:18:28,400 --> 00:18:30,200
‫el código realmente funciona.

313
00:18:30,200 --> 00:18:33,610
‫Entonces, el token no es válido o ha caducado, y eso

314
00:18:33,610 --> 00:18:35,999
‫se debe a que, bueno, han pasado

315
00:18:35,999 --> 00:18:38,640
‫10 minutos desde que realmente creé ese token.

316
00:18:38,640 --> 00:18:41,240
‫Y creo que todavía no lo habíamos

317
00:18:41,240 --> 00:18:45,043
‫probado, por lo que es genial que ahora lo haya hecho accidentalmente.

318
00:18:46,370 --> 00:18:50,160
‫De nuevo, esto viene, en caso de que se esté preguntando qué diablos

319
00:18:50,160 --> 00:18:51,493
‫sucedió, así que, por

320
00:18:53,840 --> 00:18:56,500
‫supuesto, ese es este mensaje de error aquí.

321
00:18:56,500 --> 00:18:59,450
‫Y entonces significa que no encontró ningún usuario que

322
00:18:59,450 --> 00:19:03,216
‫tenga este token o que tenga un token que tenga más de

323
00:19:03,216 --> 00:19:05,163
‫10 minutos en el pasado.

324
00:19:06,600 --> 00:19:10,393
‫Y entonces, de hecho, lo que quería hacer era olvidar la contraseña.

325
00:19:12,700 --> 00:19:14,073
‫Entonces, esperemos.

326
00:19:18,000 --> 00:19:19,980
‫Entonces 8. 6 segundos,

327
00:19:19,980 --> 00:19:22,820
‫pero eso podría deberse a mi conexión a Internet.

328
00:19:22,820 --> 00:19:24,520
‫Entonces, si ejecuta esto en

329
00:19:24,520 --> 00:19:26,373
‫un servidor, probablemente será mucho más rápido.

330
00:19:27,440 --> 00:19:31,900
‫Así que tomemos eso aquí, volvamos a Postman, y ahora

331
00:19:31,900 --> 00:19:36,740
‫restablecemos la contraseña, nuevamente con esta contraseña, realmente no importa si

332
00:19:36,740 --> 00:19:39,823
‫es la misma que la anterior.

333
00:19:40,690 --> 00:19:43,580
‫Y ahora tenemos nuestro éxito aquí.

334
00:19:43,580 --> 00:19:45,193
‫Y ahora volvamos a Compass.

335
00:19:46,680 --> 00:19:51,210
‫Recarguemos, y de hecho, obtenemos el passwordChangedAt.

336
00:19:51,210 --> 00:19:53,290
‫Y eso es realmente ahora.

337
00:19:53,290 --> 00:19:57,220
‫Entonces, si ahora intentamos usar este token, por ejemplo, para acceder

338
00:19:57,220 --> 00:19:59,870
‫a esta ruta protegida, entonces eso debería

339
00:19:59,870 --> 00:20:02,130
‫funcionar debido a esa pequeña

340
00:20:02,130 --> 00:20:04,633
‫etiqueta de un segundo que hicimos.

341
00:20:06,090 --> 00:20:10,205
‫Entonces, así fue y así, así, de hecho, ahora terminamos

342
00:20:10,205 --> 00:20:12,840
‫nuestra Funcionalidad de restablecimiento de contraseña.

343
00:20:12,840 --> 00:20:16,400
‫Así que eso fue bastante código, pero por supuesto,

344
00:20:16,400 --> 00:20:18,100
‫vale la pena.

345
00:20:18,100 --> 00:20:20,470
‫Por lo tanto, siempre debe ofrecer

346
00:20:20,470 --> 00:20:22,874
‫esta funcionalidad en su aplicación web, porque

347
00:20:22,874 --> 00:20:26,750
‫de lo contrario, un usuario que olvida su contraseña está completamente jodido,

348
00:20:26,750 --> 00:20:29,140
‫ya no puede usar su aplicación, por

349
00:20:29,140 --> 00:20:31,940
‫lo que, por supuesto, esa es una práctica terrible.

350
00:20:31,940 --> 00:20:34,020
‫De todos modos, este tipo

351
00:20:34,020 --> 00:20:38,520
‫de finaliza, ya, la parte de autenticación y autorización de esta sección.

352
00:20:38,520 --> 00:20:40,510
‫Nuevamente, está bastante completo

353
00:20:40,510 --> 00:20:43,250
‫y me divertí mucho implementando esto.

354
00:20:43,250 --> 00:20:46,341
‫Entonces, esta parte para mí es donde las aplicaciones

355
00:20:46,341 --> 00:20:48,560
‫web realmente comienzan a cobrar vida.

356
00:20:48,560 --> 00:20:51,280
‫Sé que no es realmente visible en este punto,

357
00:20:51,280 --> 00:20:54,280
‫con todos estos, solo tokens y tokens de copia

358
00:20:54,280 --> 00:20:56,300
‫y pegarlos en otro lugar.

359
00:20:56,300 --> 00:20:59,630
‫Esa no es la idea habitual que tenemos de iniciar sesión,

360
00:20:59,630 --> 00:21:02,410
‫lo sé, pero, por supuesto, nuevamente, un poco más

361
00:21:02,410 --> 00:21:05,430
‫tarde, cuando finalmente comencemos a construir el sitio web

362
00:21:05,430 --> 00:21:06,580
‫dinámico, entonces, por

363
00:21:06,580 --> 00:21:09,220
‫supuesto, seguiremos usando esta autenticación que acabamos

364
00:21:09,220 --> 00:21:13,350
‫de construir y luego también se volverá visual en ese sitio web dinámico.

365
00:21:13,350 --> 00:21:16,833
‫A continuación, implementaremos la funcionalidad para actualizar el

366
00:21:16,833 --> 00:21:19,620
‫usuario y también eliminarlo, y

367
00:21:19,620 --> 00:21:22,990
‫después de eso, también hablaremos de seguridad.

368
00:21:22,990 --> 00:21:25,800
‫Eso es lo que nos espera en el resto de la

369
00:21:25,800 --> 00:21:28,323
‫sección, así que asegúrese de no perderse eso.

