﻿1
00:00:01,210 --> 00:00:04,650
‫Instructeur : Et maintenant, créons enfin la dernière partie de la

2
00:00:04,650 --> 00:00:07,010
‫fonctionnalité de réinitialisation de mot de passe,

3
00:00:07,010 --> 00:00:10,593
‫où nous définissons en fait le nouveau mot de passe pour l'utilisateur.

4
00:00:12,250 --> 00:00:15,900
‫Et donc, comme avant, commençons par définir les

5
00:00:15,900 --> 00:00:19,713
‫étapes que nous allons suivre pour ce flux resetPassword.

6
00:00:21,240 --> 00:00:26,240
‫Donc, tout d'abord, obtenez l'utilisateur en fonction du jeton.

7
00:00:30,350 --> 00:00:35,350
‫Ensuite, dans un deuxième temps, nous définirons le nouveau mot de passe

8
00:00:35,890 --> 00:00:40,153
‫mais uniquement si le jeton n'a pas expiré et qu'il

9
00:00:42,070 --> 00:00:44,040
‫y a un utilisateur.

10
00:00:44,040 --> 00:00:48,633
‫Donc, dans ce cas, définissez le nouveau mot de passe.

11
00:00:51,580 --> 00:00:55,250
‫Ensuite, nous devons mettre à jour

12
00:00:57,210 --> 00:01:01,000
‫la propriété modifiedPasswordAt pour l'utilisateur actuel, puis

13
00:01:04,080 --> 00:01:05,403
‫enfin, comme

14
00:01:07,320 --> 00:01:10,533
‫d'habitude dans cette fonctionnalité, connecter

15
00:01:11,680 --> 00:01:12,853
‫l'utilisateur.

16
00:01:14,010 --> 00:01:18,840
‫En gros, envoyez le jeton Web JSON au client.

17
00:01:18,840 --> 00:01:22,733
‫Bon, donc beaucoup de travail à faire, et commençons.

18
00:01:23,950 --> 00:01:27,493
‫Et donc, rappelez-vous de la dernière vidéo, que le jeton

19
00:01:27,493 --> 00:01:30,450
‫de réinitialisation qui est réellement envoyé dans l'URL

20
00:01:30,450 --> 00:01:33,110
‫est ce jeton non crypté ici.

21
00:01:33,110 --> 00:01:34,723
‫Donc, en fait celui-ci.

22
00:01:35,570 --> 00:01:37,810
‫Mais celui que nous avons dans la base

23
00:01:37,810 --> 00:01:39,680
‫de données est celui crypté.

24
00:01:39,680 --> 00:01:42,580
‫Nous en avons donc déjà parlé, et ce que nous devons

25
00:01:42,580 --> 00:01:44,910
‫maintenant faire, c'est essentiellement crypter à nouveau le

26
00:01:44,910 --> 00:01:46,630
‫jeton d'origine, afin que nous

27
00:01:46,630 --> 00:01:49,240
‫puissions ensuite le comparer avec celui qui est stocké,

28
00:01:49,240 --> 00:01:51,433
‫donc celui crypté dans la base de données.

29
00:01:52,870 --> 00:01:55,110
‫Donc, nous avons en fait fait quelque chose de

30
00:01:55,110 --> 00:01:57,890
‫similaire avant avec le mot de passe, mais avec le mot

31
00:01:57,890 --> 00:02:01,010
‫de passe, nous ne pouvions pas le comparer aussi facilement qu'avec celui-ci, encore

32
00:02:01,010 --> 00:02:02,650
‫une fois parce que pour

33
00:02:02,650 --> 00:02:05,770
‫le mot de passe nous avons utilisé l'algorithme bcrypt assez complexe, qui dans

34
00:02:05,770 --> 00:02:07,490
‫ce cas, nous ne l'avons pas fait.

35
00:02:07,490 --> 00:02:09,750
‫Donc, ici, c'est très simple.

36
00:02:09,750 --> 00:02:13,040
‫Tout ce que nous avons à faire à nouveau, c'est de

37
00:02:13,040 --> 00:02:17,390
‫crypter le jeton et de le comparer avec celui crypté dans la base de données.

38
00:02:17,390 --> 00:02:22,390
‫Donc, disons hashedToken, et nous aurons donc maintenant besoin

39
00:02:23,670 --> 00:02:26,813
‫du package crypto également ici.

40
00:02:31,730 --> 00:02:36,167
‫Const crypto puis require('crypto').

41
00:02:41,280 --> 00:02:42,123
‫Maintenant à droite.

42
00:02:43,780 --> 00:02:47,593
‫Ensuite, revenons en arrière, et donc, nous utilisons

43
00:02:48,750 --> 00:02:51,610
‫la crypto. createHash.

44
00:02:53,070 --> 00:02:57,973
‫Rappelez-vous, puis le nom de l'algorithme à nouveau,

45
00:02:58,910 --> 00:03:03,910
‫sha256, puis . update, essentiellement pour l'endroit, pour la chaîne

46
00:03:04,140 --> 00:03:06,040
‫que nous voulons hacher.

47
00:03:06,040 --> 00:03:10,110
‫Et donc, celui-là est, rappelez-vous dans req. paramètres.

48
00:03:10,110 --> 00:03:14,083
‫Nous utilisons donc celui-ci pendant longtemps. jeton.

49
00:03:15,060 --> 00:03:17,950
‫Et encore une fois, c'est un

50
00:03:17,950 --> 00:03:22,233
‫paramètre, car nous l'avons spécifié ici dans l'URL, donc comme ça.

51
00:03:23,250 --> 00:03:26,470
‫C'est donc maintenant un paramètre appelé jeton.

52
00:03:26,470 --> 00:03:31,470
‫Et donc, bien sûr, ici c'est req. paramètres. jeton.

53
00:03:31,804 --> 00:03:34,790
‫Et puis, enfin, nous devons aussi dire digérer et

54
00:03:36,840 --> 00:03:38,633
‫le convertir en hexadécimal.

55
00:03:40,380 --> 00:03:42,760
‫Maintenant, c'est fondamentalement la même chose

56
00:03:42,760 --> 00:03:46,180
‫qu'avant, où nous avons chiffré l'original, et nous pourrions

57
00:03:46,180 --> 00:03:49,520
‫donc le refactoriser dans sa propre fonction, mais gardons

58
00:03:49,520 --> 00:03:51,693
‫les choses simples ici.

59
00:03:54,240 --> 00:03:58,930
‫Donc, maintenant, obtenons l'utilisateur basé sur ce jeton.

60
00:03:58,930 --> 00:04:01,060
‫Parce que c'est en fait la seule

61
00:04:01,060 --> 00:04:03,530
‫chose que nous savons sur l'utilisateur en ce moment.

62
00:04:03,530 --> 00:04:07,080
‫Nous n'avons pas d'email, nous n'avons rien, donc ce token

63
00:04:07,080 --> 00:04:10,130
‫est la seule chose qui permet d'identifier l'utilisateur.

64
00:04:10,130 --> 00:04:12,520
‫Et donc nous pouvons maintenant, en gros, interroger la

65
00:04:12,520 --> 00:04:14,170
‫base de données pour ce jeton.

66
00:04:14,170 --> 00:04:17,303
‫Et il trouvera alors l'utilisateur qui possède ce jeton.

67
00:04:19,230 --> 00:04:24,230
‫Alors, attendez, comme nous le savons déjà, puis Utilisateur. trouverUn.

68
00:04:27,790 --> 00:04:31,213
‫Ainsi, cette propriété s'appelle

69
00:04:32,090 --> 00:04:36,117
‫passwordResetToken et nous recherchons le hashedToken.

70
00:04:37,940 --> 00:04:42,220
‫Et maintenant, bien sûr, nous devons le déclarer comme async et le

71
00:04:43,150 --> 00:04:44,643
‫préparer dans catchAsync.

72
00:04:48,557 --> 00:04:51,810
‫Faites-lui une sauvegarde, cela devrait corriger ce bogue,

73
00:04:51,810 --> 00:04:53,950
‫et c'est effectivement le cas.

74
00:04:53,950 --> 00:04:56,950
‫Ainsi, cela trouvera l'utilisateur qui a le

75
00:04:56,950 --> 00:04:59,100
‫jeton qui enverra via l'URL.

76
00:04:59,100 --> 00:05:00,910
‫Mais, pour le moment, nous

77
00:05:00,910 --> 00:05:04,090
‫ne prenons pas en considération la date d'expiration du jeton.

78
00:05:04,090 --> 00:05:06,000
‫Et alors comment pourrions-nous faire cela?

79
00:05:06,000 --> 00:05:09,020
‫Eh bien, en gros, ce que nous voulons, c'est

80
00:05:09,020 --> 00:05:11,860
‫vérifier si la propriété passwordResetExpires est supérieure à

81
00:05:11,860 --> 00:05:13,723
‫ce qu'elle est actuellement.

82
00:05:14,890 --> 00:05:17,350
‫Parce que si la date d'expiration est supérieure à maintenant,

83
00:05:17,350 --> 00:05:20,420
‫cela signifie que c'est dans le futur, ce qui signifie à son

84
00:05:20,420 --> 00:05:22,313
‫tour qu'elle n'a pas encore expiré.

85
00:05:23,180 --> 00:05:24,850
‫Et donc, c'est un

86
00:05:24,850 --> 00:05:28,343
‫moyen très simple de le faire correctement avec cette requête.

87
00:05:30,619 --> 00:05:32,702
‫Donc, passwordResetExpires, qui est l'endroit où cette

88
00:05:35,170 --> 00:05:37,460
‫date est stockée, et maintenant tout ce dont

89
00:05:37,460 --> 00:05:38,840
‫nous avons besoin pour

90
00:05:38,840 --> 00:05:41,470
‫vérifier si elle est réellement supérieure à celle actuelle.

91
00:05:41,470 --> 00:05:45,440
‫Et donc nous savons déjà comment faire cela avec MongoDB, n'est-ce pas ?

92
00:05:45,440 --> 00:05:50,110
‫Donc, nouvel objet, puis le plus grand opérateur et ensuite ce avec quoi nous

93
00:05:50,110 --> 00:05:53,737
‫voulons le comparer est Date. maintenant, et ce sera

94
00:05:56,310 --> 00:05:59,410
‫en fait un horodatage de maintenant, mais

95
00:05:59,410 --> 00:06:02,900
‫dans les coulisses, MongoDB convertira alors tout au

96
00:06:02,900 --> 00:06:05,170
‫même, et pourra donc les comparer

97
00:06:05,170 --> 00:06:06,520
‫avec précision.

98
00:06:08,070 --> 00:06:10,440
‫Et ainsi, avec cela, nous pouvons, en

99
00:06:10,440 --> 00:06:14,120
‫même temps, trouver l'utilisateur du token et vérifier également si le

100
00:06:14,120 --> 00:06:16,370
‫token n'a pas encore expiré.

101
00:06:16,370 --> 00:06:18,190
‫Tellement bon.

102
00:06:18,190 --> 00:06:21,190
‫Donc, ensuite, nous voulons, bien sûr, envoyer une

103
00:06:21,190 --> 00:06:25,530
‫erreur s'il n'y a pas d'utilisateur, ou fondamentalement, si le jeton a expiré.

104
00:06:25,530 --> 00:06:27,230
‫Mais c'est, dans ce cas,

105
00:06:27,230 --> 00:06:30,500
‫la même chose, car si le jeton a expiré, eh bien,

106
00:06:30,500 --> 00:06:32,513
‫il ne renverra tout simplement aucun utilisateur.

107
00:06:33,956 --> 00:06:37,730
‫Et donc tout ce que nous avons à faire est de

108
00:06:38,970 --> 00:06:43,970
‫dire, s'il n'y a pas d'utilisateur, eh bien, comme toujours, revenez ensuite, ce n'est pas mext.

109
00:06:47,920 --> 00:06:51,910
‫Donc nouvelle AppError, et disons que

110
00:06:51,910 --> 00:06:56,793
‫le jeton n'est pas valide ou a expiré.

111
00:06:59,850 --> 00:07:02,853
‫Et puis 400, donc mauvaise demande.

112
00:07:04,140 --> 00:07:07,050
‫Et donc, s'il n'y a pas d'erreur, et

113
00:07:07,050 --> 00:07:09,400
‫si next n'est pas appelé,

114
00:07:09,400 --> 00:07:12,160
‫eh bien, définissons le mot de passe.

115
00:07:12,160 --> 00:07:15,550
‫Donc, nous avons déjà l'utilisateur et maintenant c'est très

116
00:07:15,550 --> 00:07:20,550
‫simple : user. le mot de passe est égal à req. corps. le mot de passe.

117
00:07:24,880 --> 00:07:28,140
‫Et c'est parce que nous allons bien sûr envoyer

118
00:07:28,140 --> 00:07:31,713
‫le mot de passe et également passwordConfirm via le corps.

119
00:07:33,551 --> 00:07:34,701
‫Alors dupliquons cela et

120
00:07:37,870 --> 00:07:39,553
‫confirmez également le mot de passe.

121
00:07:41,425 --> 00:07:44,630
‫Et puis aussi, supprimons essentiellement le jeton de réinitialisation

122
00:07:44,630 --> 00:07:45,733
‫et l'expiration.

123
00:07:46,800 --> 00:07:51,800
‫Donc passwordResetToken, donc comme nous l'avons fait auparavant, nous l'avons défini sur

124
00:07:52,040 --> 00:07:57,037
‫undefined, et maintenant sur user. le mot de passe expire est

125
00:07:59,510 --> 00:08:01,160
‫égal à indéfini.

126
00:08:01,160 --> 00:08:02,220
‫D'accord.

127
00:08:02,220 --> 00:08:04,350
‫Et encore une fois, bien sûr, nous devons maintenant

128
00:08:04,350 --> 00:08:07,000
‫l'enregistrer, car cela ne fait que modifier le document, il ne se

129
00:08:07,000 --> 00:08:08,410
‫met pas vraiment à jour.

130
00:08:08,410 --> 00:08:09,973
‫Donc ça ne le sauve pas vraiment.

131
00:08:11,200 --> 00:08:15,503
‫Alors, attendez l'utilisateur. enregistrer.

132
00:08:17,500 --> 00:08:20,350
‫Et dans ce cas, nous n'avons en fait

133
00:08:20,350 --> 00:08:24,340
‫pas besoin de désactiver les validateurs, car en effet, nous voulons valider.

134
00:08:24,340 --> 00:08:27,620
‫Par exemple, nous voulons que le validateur

135
00:08:27,620 --> 00:08:31,440
‫confirme si le mot de passe est égal à passwordConfirm.

136
00:08:31,440 --> 00:08:33,380
‫Et pour que ce validateur fasse automatiquement

137
00:08:33,380 --> 00:08:35,033
‫tout ce travail pour nous.

138
00:08:36,800 --> 00:08:39,390
‫Ensuite, la troisième étape, ce que nous allons faire

139
00:08:39,390 --> 00:08:42,030
‫à la fin, et donc ce que nous allons

140
00:08:42,030 --> 00:08:43,990
‫faire ensuite, c'est essentiellement verrouiller l'utilisateur.

141
00:08:43,990 --> 00:08:47,400
‫En d'autres termes, envoyez le jeton Web JSON.

142
00:08:47,400 --> 00:08:51,930
‫Et récupérons ce code d'ici, donc celui-ci.

143
00:08:51,930 --> 00:08:53,770
‫Et encore une fois, nous le

144
00:08:53,770 --> 00:08:55,700
‫faisons déjà ici à trois endroits différents.

145
00:08:55,700 --> 00:08:59,280
‫Donc ici dans la connexion, également dans l'inscription, et maintenant

146
00:08:59,280 --> 00:09:01,400
‫pour la troisième fois, ici.

147
00:09:01,400 --> 00:09:05,170
‫Et donc, dans le futur, nous refactoriserons cela dans sa

148
00:09:05,170 --> 00:09:06,383
‫propre fonction.

149
00:09:07,230 --> 00:09:09,673
‫Mais pour l'instant, on est bien comme ça.

150
00:09:11,180 --> 00:09:14,743
‫Et donc, allons-y maintenant et testons cela.

151
00:09:16,710 --> 00:09:19,020
‫Donc, ce jeton de réinitialisation que

152
00:09:19,020 --> 00:09:22,080
‫nous avions auparavant a déjà expiré, et nous devons

153
00:09:22,080 --> 00:09:24,640
‫donc en demander un nouveau, en gros.

154
00:09:24,640 --> 00:09:29,490
‫Venons-en donc à Postman et empruntons notre route pour oublier le mot de passe.

155
00:09:29,490 --> 00:09:32,120
‫Réduisons simplement l'encombrement ici et

156
00:09:32,120 --> 00:09:36,350
‫débarrassons-nous de tous ces onglets ouverts dont nous n'avons

157
00:09:36,350 --> 00:09:37,500
‫plus besoin.

158
00:09:38,910 --> 00:09:41,150
‫En fait, ici, nous aurons besoin de ce

159
00:09:43,480 --> 00:09:45,270
‫test pour ce mot de passe

160
00:09:45,270 --> 00:09:48,210
‫de réinitialisation, car rappelez-vous que celui-ci récupère en fait un

161
00:09:48,210 --> 00:09:51,540
‫jeton Web JSON, et nous voulons donc l'enregistrer dans la variable

162
00:09:51,540 --> 00:09:52,890
‫d'environnement, comme nous

163
00:09:52,890 --> 00:09:54,830
‫l'avons fait avec tous les autres.

164
00:09:54,830 --> 00:09:58,373
‫Alors je fais ça maintenant, juste pour ne pas l'oublier.

165
00:10:00,550 --> 00:10:04,100
‫Bon, de toute façon, commençons par oublier le

166
00:10:04,100 --> 00:10:05,690
‫mot de passe.

167
00:10:05,690 --> 00:10:08,620
‫Donc envoyer cette demande, ce qui, encore une fois,

168
00:10:08,620 --> 00:10:10,750
‫prend du temps à cause de

169
00:10:10,750 --> 00:10:14,947
‫l'envoi de l'e-mail, mais c'est parti, et passons maintenant à notre e-mail, et donc

170
00:10:16,880 --> 00:10:19,463
‫cela vient d'arriver il y a quelques secondes.

171
00:10:20,670 --> 00:10:24,890
‫Alors, c'est ça, bien sûr, ce jeton.

172
00:10:24,890 --> 00:10:29,890
‫Alors saisissons-le, copions-le et revenons maintenant à Postman, nous l'utilisons dans le

173
00:10:31,060 --> 00:10:34,303
‫mot de passe de réinitialisation, comme URL.

174
00:10:35,750 --> 00:10:37,253
‫D'accord, ça a du sens ?

175
00:10:38,250 --> 00:10:41,603
‫Encore une fois, nous envoyons ce jeton directement dans l'URL.

176
00:10:43,600 --> 00:10:45,730
‫Alors ici, spécifions le corps,

177
00:10:45,730 --> 00:10:49,453
‫car maintenant, nous devons réellement spécifier notre nouveau mot de passe.

178
00:10:53,720 --> 00:10:57,843
‫Alors mot de passe et disons newpass.

179
00:11:01,650 --> 00:11:03,050
‫Puis...

180
00:11:05,950 --> 00:11:07,450
‫Et ici appelons ça autrement,

181
00:11:07,450 --> 00:11:10,263
‫car pour l'instant, je veux en fait voir une erreur.

182
00:11:11,480 --> 00:11:14,727
‫Et bien sûr, cela s'appelle passwordConfirm.

183
00:11:17,360 --> 00:11:20,393
‫Voyons donc ce qui se passe lorsque nous essayons de faire cela.

184
00:11:23,240 --> 00:11:27,080
‫Attendons-le, et nous obtenons que le mot de passe est plus

185
00:11:27,080 --> 00:11:29,640
‫court que la longueur minimale autorisée.

186
00:11:29,640 --> 00:11:34,480
‫D'accord, changeons cela, 123, et ici disons 1234.

187
00:11:36,090 --> 00:11:37,740
‫Alors je veux qu'ils soient différents.

188
00:11:37,740 --> 00:11:40,630
‫Mais vous voyez que la validation ici a très bien fonctionné, même lors

189
00:11:40,630 --> 00:11:43,273
‫de la mise à jour du mot de passe avec save.

190
00:11:45,610 --> 00:11:48,800
‫Donc, et maintenant nous obtenons que les mots de passe ne sont pas les mêmes !

191
00:11:48,800 --> 00:11:50,960
‫Encore une fois, c'est une erreur de validation.

192
00:11:50,960 --> 00:11:53,430
‫Et rappelez-vous, en fait, que c'est la seule raison pour

193
00:11:53,430 --> 00:11:56,213
‫laquelle nous devons utiliser la sauvegarde et non la mise à jour.

194
00:11:57,206 --> 00:11:59,090
‫Alors avant, pour la mise

195
00:11:59,090 --> 00:12:03,220
‫à jour des visites, nous utilisions findOneAndUpdate, mais maintenant, pour tout

196
00:12:03,220 --> 00:12:06,820
‫ce qui concerne les mots de passe et l'utilisateur, nous

197
00:12:06,820 --> 00:12:10,110
‫utilisons toujours save, car nous voulons toujours exécuter tous

198
00:12:10,110 --> 00:12:12,580
‫les validateurs, et surtout, les fonctions

199
00:12:12,580 --> 00:12:14,450
‫de sauvegarde du middleware.

200
00:12:14,450 --> 00:12:18,293
‫Ainsi, par exemple, ceux où les mots de passe sont cryptés.

201
00:12:20,400 --> 00:12:21,610
‫Alors finissons-en maintenant.

202
00:12:21,610 --> 00:12:25,030
‫Oh, je ne l'ai pas vraiment corrigé, désolé pour ça.

203
00:12:25,030 --> 00:12:28,230
‫Et maintenant, cela devrait fonctionner.

204
00:12:28,230 --> 00:12:32,870
‫Et en effet, nous obtenons du succès, et nous obtenons un nouveau jeton.

205
00:12:32,870 --> 00:12:36,600
‫Tellement génial, voyons si ce jeton est réellement valide.

206
00:12:36,600 --> 00:12:40,973
‫Donc, si nous le pouvons, obtenez toutes les visites en utilisant ce tout nouveau jeton.

207
00:12:43,870 --> 00:12:46,210
‫Et c'est reparti.

208
00:12:46,210 --> 00:12:51,000
‫Ainsi, notre nouveau jeton fonctionne réellement, et maintenant pour cet utilisateur,

209
00:12:51,000 --> 00:12:53,990
‫donc pour hello@jonas, ces deux propriétés

210
00:12:53,990 --> 00:12:56,190
‫devraient en fait disparaître.

211
00:12:56,190 --> 00:12:59,760
‫Donc le mot de passe expire et le jeton devrait disparaître,

212
00:12:59,760 --> 00:13:03,550
‫puisque, eh bien, puisque c'est ce que nous avons fait dans notre code.

213
00:13:03,550 --> 00:13:06,760
‫Et donc, oui, ils ne sont plus là.

214
00:13:06,760 --> 00:13:10,210
‫Maintenant, tout ce que nous devons faire en fait, c'est cette étape manquante ici,

215
00:13:10,210 --> 00:13:12,690
‫qui consiste à mettre à jour la propriété passwordAt

216
00:13:13,610 --> 00:13:14,773
‫pour cet utilisateur actuel.

217
00:13:15,680 --> 00:13:17,260
‫Mais cela ne

218
00:13:17,260 --> 00:13:20,690
‫devrait pas être trop difficile, et revenons donc rapidement

219
00:13:20,690 --> 00:13:24,550
‫au userModel, où nous allons le faire en utilisant un middleware.

220
00:13:24,550 --> 00:13:26,800
‫Et rassemblons en fait tous les

221
00:13:26,800 --> 00:13:29,023
‫middleware ici en haut.

222
00:13:32,241 --> 00:13:35,408
‫Donc, userSchema. pre et

223
00:13:38,830 --> 00:13:42,763
‫encore dot save, puis une fonction avec next.

224
00:13:44,850 --> 00:13:47,010
‫Encore une fois, cette fonction ici

225
00:13:47,010 --> 00:13:50,890
‫va s'exécuter juste avant qu'un nouveau document ne soit réellement enregistré.

226
00:13:50,890 --> 00:13:52,220
‫Et donc, c'est

227
00:13:52,220 --> 00:13:54,880
‫l'endroit idéal pour spécifier réellement cette propriété.

228
00:13:54,880 --> 00:13:57,480
‫Et j'aurais pu, bien sûr, le faire dans un contrôleur juste

229
00:13:58,820 --> 00:14:01,133
‫à côté d'ici à ce code, par exemple.

230
00:14:02,310 --> 00:14:05,853
‫Mais je veux vraiment que cela se produise, en quelque sorte, automatiquement.

231
00:14:06,740 --> 00:14:08,700
‫Donc, un peu dans les coulisses.

232
00:14:08,700 --> 00:14:11,350
‫Parce que plus tard, nous aurons un autre endroit

233
00:14:11,350 --> 00:14:15,290
‫où nous mettrons à jour le mot de passe et ensuite nous nous assurerons

234
00:14:15,290 --> 00:14:17,410
‫que nous incluons le même code là-bas.

235
00:14:17,410 --> 00:14:19,300
‫Et comme ça, encore une fois, cela se

236
00:14:19,300 --> 00:14:20,640
‫passe, en quelque sorte,

237
00:14:20,640 --> 00:14:23,810
‫dans les coulisses, sans que nous ayons à nous en soucier du tout.

238
00:14:23,810 --> 00:14:26,600
‫Maintenant, à quel moment voulons-nous

239
00:14:26,600 --> 00:14:30,630
‫réellement définir la propriété passwordChangedAt pour le moment ?

240
00:14:30,630 --> 00:14:33,450
‫Eh bien, nous ne le voulons que lorsque nous avons réellement modifié la

241
00:14:33,450 --> 00:14:34,660
‫propriété du mot de passe.

242
00:14:34,660 --> 00:14:37,290
‫Et je ne sais pas si nous avons utilisé cette

243
00:14:37,290 --> 00:14:39,660
‫astuce avant, mais de toute façon, utilisons-la maintenant.

244
00:14:39,660 --> 00:14:44,660
‫Donc si on n'a pas modifié, alors si ce n'est pas ça. isModified, donc juste comme ça,

245
00:14:47,620 --> 00:14:49,100
‫puis le

246
00:14:49,100 --> 00:14:53,070
‫nom de la propriété, donc mot de passe.

247
00:14:53,070 --> 00:14:56,380
‫Donc, dans ce cas, revenez tout de suite

248
00:14:57,270 --> 00:14:59,360
‫et exécutez le middleware suivant.

249
00:14:59,360 --> 00:15:02,823
‫D'accord, pas comme ça, mais comme ça.

250
00:15:04,380 --> 00:15:07,770
‫Encore une fois, si nous n'avons pas modifié la propriété

251
00:15:07,770 --> 00:15:08,770
‫du mot

252
00:15:08,770 --> 00:15:12,970
‫de passe, alors bien sûr, ne manipulez pas le mot de passeChangedAt.

253
00:15:12,970 --> 00:15:15,860
‫Mais qu'en est-il de la création d'un nouveau document ?

254
00:15:15,860 --> 00:15:18,010
‫Eh bien, lorsque nous créons un nouveau

255
00:15:18,010 --> 00:15:20,150
‫document, nous modifions en fait

256
00:15:20,150 --> 00:15:24,350
‫le mot de passe, puis nous définissons la propriété passwordChangedAt, n'est-ce pas ?

257
00:15:24,350 --> 00:15:27,260
‫Eh bien, dans la mise en œuvre actuelle, nous le ferions en fait.

258
00:15:27,260 --> 00:15:29,860
‫Mais il y a autre chose que nous pouvons utiliser ici.

259
00:15:29,860 --> 00:15:32,950
‫Donc, en gros, nous voulons quitter cette fonction middleware tout

260
00:15:32,950 --> 00:15:36,630
‫de suite, si le mot de passe n'a pas été modifié

261
00:15:36,630 --> 00:15:40,274
‫ou si le document est nouveau, et nous pouvons donc utiliser

262
00:15:40,274 --> 00:15:41,633
‫la propriété isNew.

263
00:15:42,700 --> 00:15:46,210
‫Et encore une fois, c'est l'une de ces très belles choses

264
00:15:46,210 --> 00:15:48,290
‫qui s'apprennent en lisant votre documentation.

265
00:15:48,290 --> 00:15:52,010
‫Et donc, je ne saurais trop insister sur l'importance de vraiment lire les

266
00:15:52,010 --> 00:15:55,160
‫documentations lorsque vous avez besoin de quelque chose que vous

267
00:15:55,160 --> 00:15:56,870
‫ne pouvez trouver nulle part.

268
00:15:56,870 --> 00:15:59,010
‫Parce qu'il y a vraiment tellement

269
00:15:59,010 --> 00:16:02,983
‫de choses là-dedans qu'il est complètement impossible d'enseigner dans un seul cours.

270
00:16:04,810 --> 00:16:08,500
‫Quoi qu'il en soit, si le code passe cette vérification

271
00:16:08,500 --> 00:16:10,830
‫ici, eh bien, alors disons très

272
00:16:10,830 --> 00:16:14,217
‫simplement, ceci. passwordChangedAt = Date. maintenant.

273
00:16:18,660 --> 00:16:22,303
‫Et puis, nous appelons ensuite.

274
00:16:23,640 --> 00:16:26,300
‫Maintenant, en théorie, cela devrait très bien fonctionner,

275
00:16:26,300 --> 00:16:27,590
‫mais en réalité,

276
00:16:27,590 --> 00:16:30,160
‫dans la pratique, un petit problème survient parfois.

277
00:16:30,160 --> 00:16:33,580
‫Et ce problème est que parfois l'enregistrement dans la base de

278
00:16:33,580 --> 00:16:37,440
‫données est un peu plus lent que l'émission du jeton Web JSON,

279
00:16:37,440 --> 00:16:40,460
‫ce qui fait que l'horodatage du mot de passe

280
00:16:40,460 --> 00:16:42,560
‫modifié est parfois défini un

281
00:16:42,560 --> 00:16:45,280
‫peu après la création du jeton Web JSON.

282
00:16:45,280 --> 00:16:48,000
‫Et cela fera alors en sorte que l'utilisateur

283
00:16:48,000 --> 00:16:51,120
‫ne pourra pas se connecter en utilisant le nouveau jeton.

284
00:16:51,120 --> 00:16:54,570
‫Parce que, rappelez-vous, la raison pour laquelle cet horodatage existe

285
00:16:54,570 --> 00:16:57,660
‫réellement ici, c'est pour que nous puissions le

286
00:16:57,660 --> 00:17:01,200
‫comparer avec l'horodatage sur le jeton Web JSON, n'est-ce pas ?

287
00:17:01,200 --> 00:17:04,353
‫Donc, juste pour se rappeler, c'est,

288
00:17:05,930 --> 00:17:10,930
‫eh bien, donc ici, où nous vérifions si l'utilisateur a changé

289
00:17:11,560 --> 00:17:15,170
‫le mot de passe après l'émission du jeton.

290
00:17:15,170 --> 00:17:18,920
‫Et donc, ici-bas, où nous avons ensuite créé ce nouveau jeton

291
00:17:18,920 --> 00:17:21,010
‫dans réinitialiser le mot de passe.

292
00:17:21,010 --> 00:17:24,170
‫Donc, ici, rappelez-vous, nous créons ce nouveau jeton,

293
00:17:24,170 --> 00:17:27,770
‫et encore une fois, il arrive parfois que ce

294
00:17:27,770 --> 00:17:31,500
‫jeton soit créé un peu avant que l'horodatage du mot

295
00:17:31,500 --> 00:17:33,960
‫de passe modifié n'ait été créé.

296
00:17:33,960 --> 00:17:38,960
‫Et donc, nous avons juste besoin de corriger cela en soustrayant une seconde.

297
00:17:39,610 --> 00:17:42,733
‫Donc, en gros, mille millisecondes.

298
00:17:43,750 --> 00:17:47,670
‫Et alors, cela mettra le mot de passeChangedAt une seconde dans le

299
00:17:47,670 --> 00:17:50,840
‫passé, d'accord, ce qui ne sera bien sûr

300
00:17:50,840 --> 00:17:54,500
‫pas précis à 100%, mais ce n'est pas du tout

301
00:17:54,500 --> 00:17:58,000
‫un problème, car une seconde ici ne fait aucune différence.

302
00:17:58,000 --> 00:18:01,213
‫C'est un petit hack, mais encore une fois, ce n'est pas un problème.

303
00:18:02,190 --> 00:18:06,190
‫Ainsi, mettre ce mot de passeChanged une seconde dans le passé garantira alors

304
00:18:06,190 --> 00:18:08,920
‫que le jeton est toujours créé après que

305
00:18:08,920 --> 00:18:11,433
‫le mot de passe a été modifié.

306
00:18:13,290 --> 00:18:15,800
‫Donc, cela fonctionne maintenant,

307
00:18:15,800 --> 00:18:18,380
‫mais comme toujours, testons-le également rapidement.

308
00:18:18,380 --> 00:18:21,060
‫Bon, revenons à Postman.

309
00:18:21,060 --> 00:18:23,990
‫Faisons un nouveau mot de passe de réinitialisation, ou en fait,

310
00:18:23,990 --> 00:18:26,060
‫ce n'est pas du tout ce que

311
00:18:26,060 --> 00:18:28,400
‫je voulais, mais c'est une bonne chose de

312
00:18:28,400 --> 00:18:30,200
‫voir que le code fonctionne réellement.

313
00:18:30,200 --> 00:18:33,610
‫Donc, le jeton n'est pas valide ou a expiré, et c'est

314
00:18:33,610 --> 00:18:35,999
‫parce que, eh bien, 10 minutes se

315
00:18:35,999 --> 00:18:38,640
‫sont écoulées depuis que j'ai réellement créé ce jeton.

316
00:18:38,640 --> 00:18:41,240
‫Et je pense que nous n'avions pas encore

317
00:18:41,240 --> 00:18:45,043
‫testé cela, et c'est donc bien que cela l'ait fait accidentellement maintenant.

318
00:18:46,370 --> 00:18:50,160
‫Encore une fois, cela vient, au cas où vous vous demanderiez ce

319
00:18:50,160 --> 00:18:51,493
‫qui s'est passé,

320
00:18:53,840 --> 00:18:56,500
‫alors c'est bien sûr ce message d'erreur ici.

321
00:18:56,500 --> 00:18:59,450
‫Et cela signifie donc qu'il n'a trouvé aucun utilisateur

322
00:18:59,450 --> 00:19:03,216
‫qui possède ce jeton ou qui a un jeton qui remonte

323
00:19:03,216 --> 00:19:05,163
‫à plus de 10 minutes.

324
00:19:06,600 --> 00:19:10,393
‫Et donc, en effet, ce que je voulais faire, c'est oublier le mot de passe.

325
00:19:12,700 --> 00:19:14,073
‫Alors, attendons-le.

326
00:19:18,000 --> 00:19:19,980
‫Donc 8. 6 secondes,

327
00:19:19,980 --> 00:19:22,820
‫mais c'est peut-être à cause de ma connexion Internet.

328
00:19:22,820 --> 00:19:24,520
‫Donc, si vous l'exécutez sur un

329
00:19:24,520 --> 00:19:26,373
‫serveur, ce sera probablement beaucoup plus rapide.

330
00:19:27,440 --> 00:19:31,900
‫Alors récupérons cela ici, revenons à Postman, et maintenant nous réinitialisons

331
00:19:31,900 --> 00:19:36,740
‫le mot de passe, encore une fois avec ce mot de passe, peu

332
00:19:36,740 --> 00:19:39,823
‫importe s'il est le même que l'ancien.

333
00:19:40,690 --> 00:19:43,580
‫Et, maintenant nous avons notre succès ici.

334
00:19:43,580 --> 00:19:45,193
‫Et maintenant, revenons à Compass.

335
00:19:46,680 --> 00:19:51,210
‫Rechargeons, et en effet, nous obtenons le mot de passeChangedAt.

336
00:19:51,210 --> 00:19:53,290
‫Et c'est en fait maintenant.

337
00:19:53,290 --> 00:19:57,220
‫Et donc, si nous essayions maintenant d'utiliser réellement ce jeton, par exemple,

338
00:19:57,220 --> 00:19:59,870
‫pour accéder à cette route protégée, alors cela

339
00:19:59,870 --> 00:20:02,130
‫devrait fonctionner à cause de cette

340
00:20:02,130 --> 00:20:04,633
‫petite balise d'une seconde que nous avons faite.

341
00:20:06,090 --> 00:20:10,205
‫Donc, c'est fait et juste comme ça, nous avons maintenant terminé notre

342
00:20:10,205 --> 00:20:12,840
‫fonctionnalité de réinitialisation de mot de passe.

343
00:20:12,840 --> 00:20:16,400
‫C'était donc pas mal de code, mais bien sûr, ça en

344
00:20:16,400 --> 00:20:18,100
‫vaut vraiment la peine.

345
00:20:18,100 --> 00:20:20,470
‫Donc, vous devriez toujours proposer cette

346
00:20:20,470 --> 00:20:22,874
‫fonctionnalité dans votre application web, car sinon,

347
00:20:22,874 --> 00:20:26,750
‫un utilisateur qui oublie son mot de passe est complètement foutu,

348
00:20:26,750 --> 00:20:29,140
‫il ne peut plus utiliser votre application,

349
00:20:29,140 --> 00:20:31,940
‫et donc, c'est bien sûr une pratique terrible.

350
00:20:31,940 --> 00:20:34,020
‫Quoi qu'il en soit, ce

351
00:20:34,020 --> 00:20:38,520
‫genre de finitions, déjà, la partie authentification et autorisation de cette section.

352
00:20:38,520 --> 00:20:40,510
‫Donc encore une fois, c'est assez complet

353
00:20:40,510 --> 00:20:43,250
‫et je me suis beaucoup amusé à le mettre en œuvre.

354
00:20:43,250 --> 00:20:46,341
‫Donc, cette partie pour moi est l'endroit où les applications

355
00:20:46,341 --> 00:20:48,560
‫Web commencent vraiment à prendre vie.

356
00:20:48,560 --> 00:20:51,280
‫Je sais que ce n'est pas vraiment visible à

357
00:20:51,280 --> 00:20:54,280
‫ce stade, avec tout cela, juste des jetons et copier

358
00:20:54,280 --> 00:20:56,300
‫des jetons et les coller ailleurs.

359
00:20:56,300 --> 00:20:59,630
‫Ce n'est pas l'idée habituelle que nous avons de nous connecter,

360
00:20:59,630 --> 00:21:02,410
‫je sais, mais bien sûr encore, un peu plus

361
00:21:02,410 --> 00:21:05,430
‫tard, lorsque nous commencerons enfin à créer le site Web

362
00:21:05,430 --> 00:21:06,580
‫dynamique, nous continuerons

363
00:21:06,580 --> 00:21:09,220
‫bien sûr à utiliser cette authentification que

364
00:21:09,220 --> 00:21:13,350
‫nous venons de créer et puis deviendra également visuel sur ce site Web dynamique.

365
00:21:13,350 --> 00:21:16,833
‫Ensuite, nous allons implémenter des fonctionnalités pour mettre à

366
00:21:16,833 --> 00:21:19,620
‫jour l'utilisateur et également le supprimer,

367
00:21:19,620 --> 00:21:22,990
‫et après cela, nous parlerons également de sécurité.

368
00:21:22,990 --> 00:21:25,800
‫C'est donc ce qui vous attend pour le reste de la

369
00:21:25,800 --> 00:21:28,323
‫section, alors assurez-vous de ne pas manquer cela.

