﻿1
00:00:01,210 --> 00:00:04,650
‫Istruttore: E ora creiamo finalmente l'ultima parte della

2
00:00:04,650 --> 00:00:07,010
‫funzionalità di reimpostazione della

3
00:00:07,010 --> 00:00:10,593
‫password, dove impostiamo effettivamente la nuova password per l'utente.

4
00:00:12,250 --> 00:00:15,900
‫E quindi, proprio come prima, iniziamo definendo

5
00:00:15,900 --> 00:00:19,713
‫i passaggi che seguiremo per questo flusso di resetPassword.

6
00:00:21,240 --> 00:00:26,240
‫Quindi, prima di tutto, ottieni l'utente in base al token.

7
00:00:30,350 --> 00:00:35,350
‫Quindi, come secondo passaggio, imposteremo la nuova password ma

8
00:00:35,890 --> 00:00:40,153
‫solo se il token non è scaduto e

9
00:00:42,070 --> 00:00:44,040
‫c'è un utente.

10
00:00:44,040 --> 00:00:48,633
‫Quindi, in tal caso, imposta la nuova password.

11
00:00:51,580 --> 00:00:55,250
‫Successivamente, è necessario aggiornare la proprietà

12
00:00:57,210 --> 00:01:01,000
‫changePasswordAt per l'utente corrente e infine, come

13
00:01:04,080 --> 00:01:05,403
‫al solito

14
00:01:07,320 --> 00:01:10,533
‫in questa funzionalità, eseguire l'accesso

15
00:01:11,680 --> 00:01:12,853
‫dell'utente.

16
00:01:14,010 --> 00:01:18,840
‫Fondamentalmente, invia il token Web JSON al client.

17
00:01:18,840 --> 00:01:22,733
‫Ok, c'è tanto lavoro da fare, quindi cominciamo.

18
00:01:23,950 --> 00:01:27,493
‫E quindi, ricorda dall'ultimo video, che il token di

19
00:01:27,493 --> 00:01:30,450
‫ripristino che viene effettivamente inviato nell'URL è

20
00:01:30,450 --> 00:01:33,110
‫questo token non crittografato qui.

21
00:01:33,110 --> 00:01:34,723
‫Quindi, in realtà questo.

22
00:01:35,570 --> 00:01:37,810
‫Ma quello che abbiamo nel

23
00:01:37,810 --> 00:01:39,680
‫database è quello crittografato.

24
00:01:39,680 --> 00:01:42,580
‫Quindi ne abbiamo parlato prima, e quindi quello che

25
00:01:42,580 --> 00:01:44,910
‫dobbiamo fare ora è fondamentalmente crittografare

26
00:01:44,910 --> 00:01:46,630
‫di nuovo il token

27
00:01:46,630 --> 00:01:49,240
‫originale, quindi possiamo confrontarlo con quello che è

28
00:01:49,240 --> 00:01:51,433
‫archiviato, quindi quello crittografato nel database.

29
00:01:52,870 --> 00:01:55,110
‫Quindi, in realtà abbiamo fatto qualcosa di

30
00:01:55,110 --> 00:01:57,890
‫simile prima con la password, ma con la password

31
00:01:57,890 --> 00:02:01,010
‫non abbiamo potuto confrontarla facilmente come possiamo con questa, ancora

32
00:02:01,010 --> 00:02:02,650
‫una volta perché per

33
00:02:02,650 --> 00:02:05,770
‫la password abbiamo usato l'algoritmo bcrypt piuttosto complesso, che in

34
00:02:05,770 --> 00:02:07,490
‫questo caso, non l'abbiamo fatto.

35
00:02:07,490 --> 00:02:09,750
‫Quindi, qui è molto semplice.

36
00:02:09,750 --> 00:02:13,040
‫Tutto ciò che dobbiamo fare di nuovo

37
00:02:13,040 --> 00:02:17,390
‫è crittografare il token e confrontarlo con quello crittografato nel database.

38
00:02:17,390 --> 00:02:22,390
‫Quindi, diciamo hashToken, e quindi ora avremo bisogno

39
00:02:23,670 --> 00:02:26,813
‫del pacchetto crittografico anche qui.

40
00:02:31,730 --> 00:02:36,167
‫Const crypto e poi require('crypto').

41
00:02:41,280 --> 00:02:42,123
‫Ora giusto.

42
00:02:43,780 --> 00:02:47,593
‫Poi torniamo indietro, e così usiamo

43
00:02:48,750 --> 00:02:51,610
‫le criptovalute. createHash.

44
00:02:53,070 --> 00:02:57,973
‫Ricorda, quindi di nuovo il nome dell'algoritmo,

45
00:02:58,910 --> 00:03:03,910
‫sha256, quindi . aggiornamento, fondamentalmente per il luogo, per la

46
00:03:04,140 --> 00:03:06,040
‫stringa che vogliamo hash.

47
00:03:06,040 --> 00:03:10,110
‫E così, quello è, ricorda in req. parametri.

48
00:03:10,110 --> 00:03:14,083
‫Quindi usiamo questo per molto tempo. gettone.

49
00:03:15,060 --> 00:03:17,950
‫E così di nuovo, è un

50
00:03:17,950 --> 00:03:22,233
‫parametro, perché lo abbiamo specificato qui nell'URL, quindi così.

51
00:03:23,250 --> 00:03:26,470
‫Quindi, ora è un parametro chiamato token.

52
00:03:26,470 --> 00:03:31,470
‫E quindi, ovviamente, qui è req. parametri. gettone.

53
00:03:31,804 --> 00:03:34,790
‫E poi, infine, dobbiamo anche dire digest

54
00:03:36,840 --> 00:03:38,633
‫e convertirlo in esadecimale.

55
00:03:40,380 --> 00:03:42,760
‫Ora questo è fondamentalmente lo stesso

56
00:03:42,760 --> 00:03:46,180
‫di prima, in cui abbiamo crittografato quello originale, e

57
00:03:46,180 --> 00:03:49,520
‫quindi abbiamo potuto rifattorizzarlo nella sua funzione, ma manteniamo

58
00:03:49,520 --> 00:03:51,693
‫le cose semplici qui.

59
00:03:54,240 --> 00:03:58,930
‫Quindi, ora otteniamo effettivamente l'utente in base a questo token.

60
00:03:58,930 --> 00:04:01,060
‫Perché questa è in realtà l'unica

61
00:04:01,060 --> 00:04:03,530
‫cosa che sappiamo dell'utente in questo momento.

62
00:04:03,530 --> 00:04:07,080
‫Non abbiamo email, non abbiamo nulla, quindi questo token

63
00:04:07,080 --> 00:04:10,130
‫è l'unica cosa che può identificare l'utente.

64
00:04:10,130 --> 00:04:12,520
‫E quindi ora possiamo, in pratica, interrogare il

65
00:04:12,520 --> 00:04:14,170
‫database per questo token.

66
00:04:14,170 --> 00:04:17,303
‫E troverà quindi l'utente che ha questo token.

67
00:04:19,230 --> 00:04:24,230
‫Quindi, aspetta, come già sappiamo, e poi Utente. trova uno.

68
00:04:27,790 --> 00:04:31,213
‫Quindi, quella proprietà si

69
00:04:32,090 --> 00:04:36,117
‫chiama passwordResetToken e stiamo cercando l'hashedToken.

70
00:04:37,940 --> 00:04:42,220
‫E ora, ovviamente, dobbiamo dichiararlo asincrono e prepararlo

71
00:04:43,150 --> 00:04:44,643
‫in catchAsync.

72
00:04:48,557 --> 00:04:51,810
‫Dagli un salvataggio, che dovrebbe risolvere questo bug,

73
00:04:51,810 --> 00:04:53,950
‫e in effetti lo fa.

74
00:04:53,950 --> 00:04:56,950
‫Quindi, questo troverà l'utente che ha il

75
00:04:56,950 --> 00:04:59,100
‫token che invierà tramite URL.

76
00:04:59,100 --> 00:05:00,910
‫Ma, in questo momento, non

77
00:05:00,910 --> 00:05:04,090
‫stiamo prendendo in considerazione la data di scadenza del token.

78
00:05:04,090 --> 00:05:06,000
‫E quindi come potremmo farlo?

79
00:05:06,000 --> 00:05:09,020
‫Bene, in pratica, ciò che vogliamo è

80
00:05:09,020 --> 00:05:11,860
‫verificare se la proprietà passwordResetExpires è maggiore

81
00:05:11,860 --> 00:05:13,723
‫di quella attuale.

82
00:05:14,890 --> 00:05:17,350
‫Perché se la data di scadenza è maggiore di

83
00:05:17,350 --> 00:05:20,420
‫quella attuale, significa che è nel futuro, il che a sua volta

84
00:05:20,420 --> 00:05:22,313
‫significa che non è ancora scaduta.

85
00:05:23,180 --> 00:05:24,850
‫E quindi, questo è un

86
00:05:24,850 --> 00:05:28,343
‫modo molto semplice in cui possiamo effettivamente farlo correttamente con questa query.

87
00:05:30,619 --> 00:05:32,702
‫Quindi, passwordResetExpires, che è dove è

88
00:05:35,170 --> 00:05:37,460
‫memorizzata quella data, e ora tutto

89
00:05:37,460 --> 00:05:38,840
‫ciò che serve

90
00:05:38,840 --> 00:05:41,470
‫per verificare se è effettivamente maggiore di adesso.

91
00:05:41,470 --> 00:05:45,440
‫E quindi sappiamo già come farlo con MongoDB, giusto?

92
00:05:45,440 --> 00:05:50,110
‫Quindi, nuovo oggetto e quindi l'operatore maggiore e quindi ciò con cui

93
00:05:50,110 --> 00:05:53,737
‫vogliamo confrontarlo è Data. ora, e questo sarà

94
00:05:56,310 --> 00:05:59,410
‫effettivamente un timestamp di adesso, ma dietro

95
00:05:59,410 --> 00:06:02,900
‫le quinte, MongoDB convertirà tutto allo stesso modo,

96
00:06:02,900 --> 00:06:05,170
‫e quindi sarà in grado di

97
00:06:05,170 --> 00:06:06,520
‫confrontarli accuratamente.

98
00:06:08,070 --> 00:06:10,440
‫E così con questo possiamo, allo stesso

99
00:06:10,440 --> 00:06:14,120
‫tempo, trovare l'utente per il token e anche verificare se il

100
00:06:14,120 --> 00:06:16,370
‫token non è ancora scaduto.

101
00:06:16,370 --> 00:06:18,190
‫Quindi, fantastico.

102
00:06:18,190 --> 00:06:21,190
‫Quindi, in seguito vogliamo, ovviamente, inviare un errore

103
00:06:21,190 --> 00:06:25,530
‫se non ci sono utenti o, in pratica, se il token è scaduto.

104
00:06:25,530 --> 00:06:27,230
‫Ma in questo caso

105
00:06:27,230 --> 00:06:30,500
‫è lo stesso, perché se il token è scaduto,

106
00:06:30,500 --> 00:06:32,513
‫beh, semplicemente non restituirà alcun utente.

107
00:06:33,956 --> 00:06:37,730
‫E quindi tutto ciò che dobbiamo fare è dire,

108
00:06:38,970 --> 00:06:43,970
‫se nessun utente, beh, allora, come sempre, torna dopo, non è corretto.

109
00:06:47,920 --> 00:06:51,910
‫Quindi nuovo AppError e diciamo che

110
00:06:51,910 --> 00:06:56,793
‫il token non è valido o è scaduto.

111
00:06:59,850 --> 00:07:02,853
‫E poi 400, quindi brutta richiesta.

112
00:07:04,140 --> 00:07:07,050
‫E quindi, se non ci sono errori

113
00:07:07,050 --> 00:07:09,400
‫e se next non viene

114
00:07:09,400 --> 00:07:12,160
‫chiamato, allora impostiamo effettivamente la password.

115
00:07:12,160 --> 00:07:15,550
‫Quindi, abbiamo già ottenuto l'utente e ora è molto

116
00:07:15,550 --> 00:07:20,550
‫semplice: utente. la password è uguale a req. corpo. parola d'ordine.

117
00:07:24,880 --> 00:07:28,140
‫E questo perché, ovviamente, invieremo la

118
00:07:28,140 --> 00:07:31,713
‫password e anche la passwordConfirm tramite il corpo.

119
00:07:33,551 --> 00:07:34,701
‫Quindi duplichiamo

120
00:07:37,870 --> 00:07:39,553
‫anche quello e passwordConfirm.

121
00:07:41,425 --> 00:07:44,630
‫E poi, in pratica, eliminiamo il token di ripristino

122
00:07:44,630 --> 00:07:45,733
‫e quello scaduto.

123
00:07:46,800 --> 00:07:51,800
‫Quindi passwordResetToken, proprio come abbiamo fatto prima, lo impostiamo su

124
00:07:52,040 --> 00:07:57,037
‫undefined e ora user. la password scade è uguale

125
00:07:59,510 --> 00:08:01,160
‫a undefined.

126
00:08:01,160 --> 00:08:02,220
‫Va bene.

127
00:08:02,220 --> 00:08:04,350
‫E ancora, ovviamente, ora dobbiamo salvarlo,

128
00:08:04,350 --> 00:08:07,000
‫perché questo modifica solo il documento, non

129
00:08:07,000 --> 00:08:08,410
‫si aggiorna davvero.

130
00:08:08,410 --> 00:08:09,973
‫Quindi non lo salva davvero.

131
00:08:11,200 --> 00:08:15,503
‫Quindi, attendi utente. Salva.

132
00:08:17,500 --> 00:08:20,350
‫E in questo caso, in realtà

133
00:08:20,350 --> 00:08:24,340
‫non dobbiamo disattivare i validatori, perché in effetti vogliamo convalidare.

134
00:08:24,340 --> 00:08:27,620
‫Ad esempio, vogliamo che il validatore

135
00:08:27,620 --> 00:08:31,440
‫confermi se la password è uguale a passwordConfirm.

136
00:08:31,440 --> 00:08:33,380
‫E così quel validatore fa automaticamente tutto

137
00:08:33,380 --> 00:08:35,033
‫ciò che funziona per noi.

138
00:08:36,800 --> 00:08:39,390
‫Quindi il terzo passaggio, quello che faremo in

139
00:08:39,390 --> 00:08:42,030
‫realtà alla fine, e quindi quello che faremo

140
00:08:42,030 --> 00:08:43,990
‫dopo è sostanzialmente bloccare l'utente.

141
00:08:43,990 --> 00:08:47,400
‫Quindi, in altre parole, invia il token Web JSON.

142
00:08:47,400 --> 00:08:51,930
‫E prendiamo quel codice da qui, quindi questo.

143
00:08:51,930 --> 00:08:53,770
‫E ancora, lo stiamo già

144
00:08:53,770 --> 00:08:55,700
‫facendo qui in tre posti diversi.

145
00:08:55,700 --> 00:08:59,280
‫Quindi qui nel login, anche nella registrazione, e ora

146
00:08:59,280 --> 00:09:01,400
‫per la terza volta, quaggiù.

147
00:09:01,400 --> 00:09:05,170
‫E così, in futuro, lo riformeremo nella

148
00:09:05,170 --> 00:09:06,383
‫sua funzione.

149
00:09:07,230 --> 00:09:09,673
‫Ma per ora siamo a posto così.

150
00:09:11,180 --> 00:09:14,743
‫E quindi, ora andiamo avanti e proviamo questo.

151
00:09:16,710 --> 00:09:19,020
‫Quindi questo token di ripristino

152
00:09:19,020 --> 00:09:22,080
‫che avevamo prima è già scaduto, quindi

153
00:09:22,080 --> 00:09:24,640
‫dobbiamo chiederne uno nuovo, in pratica.

154
00:09:24,640 --> 00:09:29,490
‫Quindi veniamo da Postman e seguiamo il nostro percorso per dimenticare la password.

155
00:09:29,490 --> 00:09:32,120
‫Riduciamo il disordine qui ed

156
00:09:32,120 --> 00:09:36,350
‫eliminiamo tutte queste schede aperte di cui non abbiamo

157
00:09:36,350 --> 00:09:37,500
‫più bisogno.

158
00:09:38,910 --> 00:09:41,150
‫In realtà qui avremo bisogno di

159
00:09:43,480 --> 00:09:45,270
‫questo test per questa reimpostazione

160
00:09:45,270 --> 00:09:48,210
‫della password, perché ricorda, questo in realtà restituisce un

161
00:09:48,210 --> 00:09:51,540
‫token Web JSON e quindi vogliamo salvarlo nella variabile d'ambiente,

162
00:09:51,540 --> 00:09:52,890
‫proprio come abbiamo

163
00:09:52,890 --> 00:09:54,830
‫fatto con tutti gli altri.

164
00:09:54,830 --> 00:09:58,373
‫Quindi lo sto facendo ora, solo per non dimenticarlo.

165
00:10:00,550 --> 00:10:04,100
‫Va bene, comunque, iniziamo con, in pratica,

166
00:10:04,100 --> 00:10:05,690
‫dimenticando la password.

167
00:10:05,690 --> 00:10:08,620
‫Quindi inviare quella richiesta, che di nuovo richiede

168
00:10:08,620 --> 00:10:10,750
‫del tempo a causa dell'invio

169
00:10:10,750 --> 00:10:14,947
‫dell'e-mail, ma ci siamo, e ora andiamo alla nostra e-mail, e

170
00:10:16,880 --> 00:10:19,463
‫quindi è arrivata solo pochi secondi fa.

171
00:10:20,670 --> 00:10:24,890
‫Quindi, è questo, ovviamente, questo token.

172
00:10:24,890 --> 00:10:29,890
‫Quindi prendiamolo, copiamolo e ora torniamo a Postman, lo usiamo

173
00:10:31,060 --> 00:10:34,303
‫in Reimposta password, come URL.

174
00:10:35,750 --> 00:10:37,253
‫Ok, ha senso?

175
00:10:38,250 --> 00:10:41,603
‫Quindi, di nuovo, stiamo inviando quel token direttamente nell'URL.

176
00:10:43,600 --> 00:10:45,730
‫Quindi qui, specifichiamo il corpo,

177
00:10:45,730 --> 00:10:49,453
‫perché ora dobbiamo specificare effettivamente la nostra nuova password.

178
00:10:53,720 --> 00:10:57,843
‫Quindi password e diciamo newpass.

179
00:11:01,650 --> 00:11:03,050
‫Poi...

180
00:11:05,950 --> 00:11:07,450
‫E qui chiamiamolo in un

181
00:11:07,450 --> 00:11:10,263
‫altro modo, perché per ora voglio davvero vedere un errore.

182
00:11:11,480 --> 00:11:14,727
‫E, naturalmente, si chiama passwordConfirm.

183
00:11:17,360 --> 00:11:20,393
‫Quindi vediamo cosa succede quando proviamo a farlo.

184
00:11:23,240 --> 00:11:27,080
‫Aspettiamo e otteniamo che la password sia più

185
00:11:27,080 --> 00:11:29,640
‫corta della lunghezza minima consentita.

186
00:11:29,640 --> 00:11:34,480
‫Ok, allora cambiamolo, 123, e qui diciamo 1234.

187
00:11:36,090 --> 00:11:37,740
‫Quindi voglio che siano diversi.

188
00:11:37,740 --> 00:11:40,630
‫Ma vedi che la convalida qui ha funzionato bene,

189
00:11:40,630 --> 00:11:43,273
‫anche durante l'aggiornamento della password con save.

190
00:11:45,610 --> 00:11:48,800
‫Quindi, e ora otteniamo le password non sono le stesse!

191
00:11:48,800 --> 00:11:50,960
‫Quindi di nuovo, questo è un errore di convalida.

192
00:11:50,960 --> 00:11:53,430
‫E ricorda, in realtà, che questo è l'intero

193
00:11:53,430 --> 00:11:56,213
‫motivo per cui dobbiamo usare il salvataggio e non l'aggiornamento.

194
00:11:57,206 --> 00:11:59,090
‫Quindi prima, per aggiornare

195
00:11:59,090 --> 00:12:03,220
‫i tour, usavamo findOneAndUpdate, ma ora, per tutto ciò

196
00:12:03,220 --> 00:12:06,820
‫che riguarda le password e l'utente, usiamo sempre

197
00:12:06,820 --> 00:12:10,110
‫save, perché vogliamo sempre eseguire tutti i

198
00:12:10,110 --> 00:12:12,580
‫validatori, e soprattutto le funzioni di

199
00:12:12,580 --> 00:12:14,450
‫salvataggio del middleware.

200
00:12:14,450 --> 00:12:18,293
‫Quindi, ad esempio, quelli in cui le password sono crittografate.

201
00:12:20,400 --> 00:12:21,610
‫Quindi finiamola adesso.

202
00:12:21,610 --> 00:12:25,030
‫Oh, in realtà non l'ho corretto, scusa per quello.

203
00:12:25,030 --> 00:12:28,230
‫E ora dovrebbe funzionare davvero.

204
00:12:28,230 --> 00:12:32,870
‫E infatti, otteniamo successo e otteniamo un nuovo token.

205
00:12:32,870 --> 00:12:36,600
‫Ottimo, vediamo se questo token è effettivamente valido.

206
00:12:36,600 --> 00:12:40,973
‫Quindi, se possiamo, ottieni tutti i tour usando questo nuovissimo token.

207
00:12:43,870 --> 00:12:46,210
‫E qui andiamo.

208
00:12:46,210 --> 00:12:51,000
‫Quindi, il nostro nuovo token funziona davvero, e ora per questo

209
00:12:51,000 --> 00:12:53,990
‫utente, quindi per hello@jonas, queste due proprietà

210
00:12:53,990 --> 00:12:56,190
‫dovrebbero effettivamente essere sparite.

211
00:12:56,190 --> 00:12:59,760
‫Quindi la password scade e il token dovrebbe essere sparito,

212
00:12:59,760 --> 00:13:03,550
‫poiché, beh, poiché è quello che abbiamo fatto nel nostro codice.

213
00:13:03,550 --> 00:13:06,760
‫E quindi, sì, non sono più qui.

214
00:13:06,760 --> 00:13:10,210
‫Ora tutto ciò che dobbiamo fare in realtà è questo passaggio

215
00:13:10,210 --> 00:13:12,690
‫mancante qui, ovvero aggiornare la proprietà passwordAt per

216
00:13:13,610 --> 00:13:14,773
‫questo utente corrente.

217
00:13:15,680 --> 00:13:17,260
‫Ma non dovrebbe

218
00:13:17,260 --> 00:13:20,690
‫essere troppo difficile, quindi torniamo rapidamente a

219
00:13:20,690 --> 00:13:24,550
‫userModel, che è dove lo faremo usando il middleware.

220
00:13:24,550 --> 00:13:26,800
‫E mettiamo insieme tutto il

221
00:13:26,800 --> 00:13:29,023
‫middleware qui in alto.

222
00:13:32,241 --> 00:13:35,408
‫Quindi, userSchema. pre e ancora

223
00:13:38,830 --> 00:13:42,763
‫punto save, e poi una funzione con next.

224
00:13:44,850 --> 00:13:47,010
‫Di nuovo, questa funzione verrà

225
00:13:47,010 --> 00:13:50,890
‫eseguita subito prima che un nuovo documento venga effettivamente salvato.

226
00:13:50,890 --> 00:13:52,220
‫E quindi, è

227
00:13:52,220 --> 00:13:54,880
‫il posto perfetto per specificare effettivamente questa proprietà.

228
00:13:54,880 --> 00:13:57,480
‫E avrei potuto, ovviamente, farlo in un controller

229
00:13:58,820 --> 00:14:01,133
‫proprio accanto a questo codice, per esempio.

230
00:14:02,310 --> 00:14:05,853
‫Ma voglio davvero che questo accada, in modo automatico.

231
00:14:06,740 --> 00:14:08,700
‫Quindi, un po' dietro le quinte.

232
00:14:08,700 --> 00:14:11,350
‫Perché in seguito, avremo un altro posto

233
00:14:11,350 --> 00:14:15,290
‫in cui aggiorneremo la password e quindi ci assicureremo di

234
00:14:15,290 --> 00:14:17,410
‫includere lo stesso codice lì.

235
00:14:17,410 --> 00:14:19,300
‫E così, di nuovo, accade,

236
00:14:19,300 --> 00:14:20,640
‫un po' dietro

237
00:14:20,640 --> 00:14:23,810
‫le quinte, senza che noi dobbiamo preoccuparcene affatto.

238
00:14:23,810 --> 00:14:26,600
‫Ora, quando esattamente vogliamo

239
00:14:26,600 --> 00:14:30,630
‫impostare la proprietà passwordChangedAt su adesso?

240
00:14:30,630 --> 00:14:33,450
‫Bene, lo vogliamo solo quando abbiamo effettivamente modificato la

241
00:14:33,450 --> 00:14:34,660
‫proprietà della password.

242
00:14:34,660 --> 00:14:37,290
‫E non sono sicuro che abbiamo usato questo

243
00:14:37,290 --> 00:14:39,660
‫trucco prima, ma comunque, usiamolo ora.

244
00:14:39,660 --> 00:14:44,660
‫Quindi se non abbiamo modificato, quindi se non questo. isModified, quindi proprio come

245
00:14:47,620 --> 00:14:49,100
‫questo, e

246
00:14:49,100 --> 00:14:53,070
‫poi il nome della proprietà, quindi password.

247
00:14:53,070 --> 00:14:56,380
‫Quindi, in tal caso, torna subito ed

248
00:14:57,270 --> 00:14:59,360
‫esegui il prossimo middleware.

249
00:14:59,360 --> 00:15:02,823
‫Ok, non così, ma così.

250
00:15:04,380 --> 00:15:07,770
‫Quindi, ancora una volta, se non

251
00:15:07,770 --> 00:15:08,770
‫abbiamo

252
00:15:08,770 --> 00:15:12,970
‫modificato la proprietà password, ovviamente non manipolare passwordChangedAt.

253
00:15:12,970 --> 00:15:15,860
‫Ma per quanto riguarda la creazione di un nuovo documento?

254
00:15:15,860 --> 00:15:18,010
‫Bene, quando creiamo un nuovo

255
00:15:18,010 --> 00:15:20,150
‫documento, abbiamo effettivamente modificato

256
00:15:20,150 --> 00:15:24,350
‫la password e quindi abbiamo impostato la proprietà passwordChangedAt, giusto?

257
00:15:24,350 --> 00:15:27,260
‫Bene, nell'attuale implementazione lo faremmo davvero.

258
00:15:27,260 --> 00:15:29,860
‫Ma c'è qualcos'altro che possiamo usare qui.

259
00:15:29,860 --> 00:15:32,950
‫Quindi, in sostanza, vogliamo uscire subito da

260
00:15:32,950 --> 00:15:36,630
‫questa funzione middleware, se la password non è stata modificata

261
00:15:36,630 --> 00:15:40,274
‫o se il documento è nuovo, e quindi possiamo usare

262
00:15:40,274 --> 00:15:41,633
‫la proprietà isNew.

263
00:15:42,700 --> 00:15:46,210
‫E ancora, questa è una di queste cose molto belle che

264
00:15:46,210 --> 00:15:48,290
‫si imparano leggendo la documentazione.

265
00:15:48,290 --> 00:15:52,010
‫E quindi, non posso sottolineare abbastanza quanto sia importante leggere davvero

266
00:15:52,010 --> 00:15:55,160
‫la documentazione quando hai bisogno di qualcosa che non puoi

267
00:15:55,160 --> 00:15:56,870
‫trovare da nessuna parte.

268
00:15:56,870 --> 00:15:59,010
‫Perché ci sono davvero così

269
00:15:59,010 --> 00:16:02,983
‫tante cose lì dentro che è completamente impossibile insegnare in un corso.

270
00:16:04,810 --> 00:16:08,500
‫Ad ogni modo, se il codice supera questa

271
00:16:08,500 --> 00:16:10,830
‫verifica qui, beh, allora diciamo

272
00:16:10,830 --> 00:16:14,217
‫semplicemente questo. passwordChangedAt = Data. Ora.

273
00:16:18,660 --> 00:16:22,303
‫E poi, chiamiamo il prossimo.

274
00:16:23,640 --> 00:16:26,300
‫Ora, in teoria, dovrebbe funzionare bene, ma in

275
00:16:26,300 --> 00:16:27,590
‫realtà, in pratica,

276
00:16:27,590 --> 00:16:30,160
‫a volte si verifica un piccolo problema.

277
00:16:30,160 --> 00:16:33,580
‫E quel problema è che a volte il salvataggio nel

278
00:16:33,580 --> 00:16:37,440
‫database è un po' più lento rispetto all'emissione del token Web

279
00:16:37,440 --> 00:16:40,460
‫JSON, in modo che il timestamp della password modificato

280
00:16:40,460 --> 00:16:42,560
‫a volte venga impostato un

281
00:16:42,560 --> 00:16:45,280
‫po' dopo la creazione del token Web JSON.

282
00:16:45,280 --> 00:16:48,000
‫E così ciò farà in modo

283
00:16:48,000 --> 00:16:51,120
‫che l'utente non possa accedere utilizzando il nuovo token.

284
00:16:51,120 --> 00:16:54,570
‫Perché, ricorda, l'intera ragione per cui questo timestamp

285
00:16:54,570 --> 00:16:57,660
‫qui esiste effettivamente, è che possiamo

286
00:16:57,660 --> 00:17:01,200
‫confrontarlo con il timestamp sul token Web JSON, giusto?

287
00:17:01,200 --> 00:17:04,353
‫Quindi, giusto per ricordare, è, beh,

288
00:17:05,930 --> 00:17:10,930
‫proprio qui, dove controlliamo se l'utente ha cambiato la password

289
00:17:11,560 --> 00:17:15,170
‫dopo che il token è stato emesso.

290
00:17:15,170 --> 00:17:18,920
‫E così, quaggiù, dove abbiamo quindi creato questo nuovo

291
00:17:18,920 --> 00:17:21,010
‫token in reimposta password.

292
00:17:21,010 --> 00:17:24,170
‫Quindi proprio qui, ricorda, creiamo questo nuovo token,

293
00:17:24,170 --> 00:17:27,770
‫e così di nuovo, a volte capita che questo

294
00:17:27,770 --> 00:17:31,500
‫token venga creato un po' prima che il timestamp della

295
00:17:31,500 --> 00:17:33,960
‫password modificata sia stato effettivamente creato.

296
00:17:33,960 --> 00:17:38,960
‫E quindi, dobbiamo solo aggiustarlo sottraendo un secondo.

297
00:17:39,610 --> 00:17:42,733
‫Quindi, in pratica, mille millisecondi.

298
00:17:43,750 --> 00:17:47,670
‫E quindi metterà la passwordChangedAt un secondo nel passato,

299
00:17:47,670 --> 00:17:50,840
‫ok, il che ovviamente non sarà

300
00:17:50,840 --> 00:17:54,500
‫accurato al 100%, ma non è affatto un problema,

301
00:17:54,500 --> 00:17:58,000
‫perché un secondo qui non fa alcuna differenza.

302
00:17:58,000 --> 00:18:01,213
‫È un piccolo trucco, ma ancora una volta, non è un problema.

303
00:18:02,190 --> 00:18:06,190
‫Quindi, inserire questa passwordChanged un secondo in passato, assicurerà che

304
00:18:06,190 --> 00:18:08,920
‫il token venga sempre creato dopo che

305
00:18:08,920 --> 00:18:11,433
‫la password è stata modificata.

306
00:18:13,290 --> 00:18:15,800
‫Quindi, ora funziona,

307
00:18:15,800 --> 00:18:18,380
‫ma come sempre, proviamolo rapidamente.

308
00:18:18,380 --> 00:18:21,060
‫Ok, allora torniamo al postino.

309
00:18:21,060 --> 00:18:23,990
‫Facciamo un nuovo Reset Password, o in realtà,

310
00:18:23,990 --> 00:18:26,060
‫non è proprio quello che

311
00:18:26,060 --> 00:18:28,400
‫volevo, ma è un'ottima cosa vedere che

312
00:18:28,400 --> 00:18:30,200
‫il codice funziona davvero.

313
00:18:30,200 --> 00:18:33,610
‫Quindi, il token non è valido o è scaduto, e

314
00:18:33,610 --> 00:18:35,999
‫questo perché, beh, sono trascorsi 10

315
00:18:35,999 --> 00:18:38,640
‫minuti da quando ho effettivamente creato quel token.

316
00:18:38,640 --> 00:18:41,240
‫E penso che non l'avessimo ancora

317
00:18:41,240 --> 00:18:45,043
‫testato, quindi è fantastico che ora l'abbia fatto accidentalmente.

318
00:18:46,370 --> 00:18:50,160
‫Quindi di nuovo, questo viene, nel caso ti stia chiedendo cosa diavolo

319
00:18:50,160 --> 00:18:51,493
‫è successo, quindi

320
00:18:53,840 --> 00:18:56,500
‫questo è ovviamente questo messaggio di errore qui.

321
00:18:56,500 --> 00:18:59,450
‫E quindi significa che non ha trovato nessun utente

322
00:18:59,450 --> 00:19:03,216
‫che ha questo token o che ha un token che è più

323
00:19:03,216 --> 00:19:05,163
‫di 10 minuti nel passato.

324
00:19:06,600 --> 00:19:10,393
‫E quindi, in effetti, quello che volevo fare era dimenticare la password.

325
00:19:12,700 --> 00:19:14,073
‫Quindi, aspettiamo.

326
00:19:18,000 --> 00:19:19,980
‫Quindi 8. 6 secondi,

327
00:19:19,980 --> 00:19:22,820
‫ma potrebbe essere dovuto alla mia connessione Internet.

328
00:19:22,820 --> 00:19:24,520
‫Quindi, se lo esegui su

329
00:19:24,520 --> 00:19:26,373
‫un server, probabilmente sarà molto più veloce.

330
00:19:27,440 --> 00:19:31,900
‫Quindi prendiamolo qui, di nuovo a Postman, e ora

331
00:19:31,900 --> 00:19:36,740
‫reimpostiamo la password, di nuovo con questa password, non importa se

332
00:19:36,740 --> 00:19:39,823
‫è la stessa di quella vecchia.

333
00:19:40,690 --> 00:19:43,580
‫E così ora abbiamo il nostro successo qui.

334
00:19:43,580 --> 00:19:45,193
‫E ora torniamo a Compass.

335
00:19:46,680 --> 00:19:51,210
‫Ricarichiamo, e infatti, otteniamo la passwordChangedAt.

336
00:19:51,210 --> 00:19:53,290
‫E quindi è proprio ora.

337
00:19:53,290 --> 00:19:57,220
‫E quindi, se ora provassimo a utilizzare effettivamente questo token, ad esempio,

338
00:19:57,220 --> 00:19:59,870
‫per accedere a questo percorso protetto, allora dovrebbe

339
00:19:59,870 --> 00:20:02,130
‫funzionare a causa di quel piccolo

340
00:20:02,130 --> 00:20:04,633
‫tag di un secondo che abbiamo fatto.

341
00:20:06,090 --> 00:20:10,205
‫Così è stato e così, in questo momento, abbiamo terminato la

342
00:20:10,205 --> 00:20:12,840
‫nostra funzionalità di reimpostazione della password.

343
00:20:12,840 --> 00:20:16,400
‫Quindi era un bel po' di codice, ma ovviamente

344
00:20:16,400 --> 00:20:18,100
‫ne valeva la pena.

345
00:20:18,100 --> 00:20:20,470
‫Quindi, dovresti sempre offrire questa

346
00:20:20,470 --> 00:20:22,874
‫funzionalità nella tua applicazione web, perché altrimenti,

347
00:20:22,874 --> 00:20:26,750
‫un utente che dimentica la sua password è completamente fregato, non

348
00:20:26,750 --> 00:20:29,140
‫può più utilizzare la tua applicazione,

349
00:20:29,140 --> 00:20:31,940
‫e quindi questa è ovviamente una pratica terribile.

350
00:20:31,940 --> 00:20:34,020
‫In ogni caso, questo tipo

351
00:20:34,020 --> 00:20:38,520
‫di completamento termina, già, la parte di autenticazione e autorizzazione di questa sezione.

352
00:20:38,520 --> 00:20:40,510
‫Quindi, di nuovo, è abbastanza

353
00:20:40,510 --> 00:20:43,250
‫completo e mi sono divertito molto a implementarlo.

354
00:20:43,250 --> 00:20:46,341
‫Quindi, questa parte per me è dove le applicazioni

355
00:20:46,341 --> 00:20:48,560
‫web iniziano davvero a prendere vita.

356
00:20:48,560 --> 00:20:51,280
‫So che a questo punto non è davvero visibile,

357
00:20:51,280 --> 00:20:54,280
‫con tutti questi, solo token e copia di token e

358
00:20:54,280 --> 00:20:56,300
‫incollali da qualche altra parte.

359
00:20:56,300 --> 00:20:59,630
‫Non è la solita idea che abbiamo di accedere, lo

360
00:20:59,630 --> 00:21:02,410
‫so, ma ovviamente di nuovo, un po' più

361
00:21:02,410 --> 00:21:05,430
‫tardi, quando finalmente inizieremo a costruire il sito Web

362
00:21:05,430 --> 00:21:06,580
‫dinamico, continueremo

363
00:21:06,580 --> 00:21:09,220
‫ovviamente a utilizzare questa autenticazione che abbiamo

364
00:21:09,220 --> 00:21:13,350
‫appena creato e poi diventerà anche visivo su quel sito web dinamico.

365
00:21:13,350 --> 00:21:16,833
‫Successivamente, implementeremo la funzionalità per aggiornare

366
00:21:16,833 --> 00:21:19,620
‫l'utente e anche per

367
00:21:19,620 --> 00:21:22,990
‫eliminarlo, quindi parleremo anche della sicurezza.

368
00:21:22,990 --> 00:21:25,800
‫Questo è ciò che ci aspetta per il resto

369
00:21:25,800 --> 00:21:28,323
‫della sezione, quindi assicurati di non perderlo.

