﻿1
00:00:01,260 --> 00:00:02,480
‫Jonas : Donc,

2
00:00:02,480 --> 00:00:04,560
‫dans cette conférence, nous allons implémenter la

3
00:00:04,560 --> 00:00:08,010
‫fonctionnalité de connexion des utilisateurs en fonction d'un mot de passe et

4
00:00:08,010 --> 00:00:09,363
‫d'une adresse e-mail donnés.

5
00:00:10,920 --> 00:00:14,520
‫Et comme auparavant, le concept de connexion d'un utilisateur signifie

6
00:00:14,520 --> 00:00:17,400
‫essentiellement qu'il faut signer un jeton Web JSON

7
00:00:17,400 --> 00:00:19,760
‫et le renvoyer au client.

8
00:00:19,760 --> 00:00:22,390
‫Mais dans ce cas, nous n'émettons le jeton que

9
00:00:22,390 --> 00:00:24,860
‫dans le cas où l'utilisateur existe réellement et

10
00:00:24,860 --> 00:00:27,310
‫que le mot de passe est correct.

11
00:00:27,310 --> 00:00:29,773
‫Alors, commençons à mettre cela en œuvre.

12
00:00:31,480 --> 00:00:36,260
‫Exportations. la connexion est...

13
00:00:39,090 --> 00:00:42,253
‫demande, répond et suivant.

14
00:00:44,370 --> 00:00:47,060
‫Et la première chose est de lire

15
00:00:47,060 --> 00:00:50,020
‫l'e-mail et le mot de passe du corps.

16
00:00:50,020 --> 00:00:54,740
‫Disons donc que const email est égal à req. corps. e-mail.

17
00:00:58,920 --> 00:01:02,070
‫D'accord, et maintenant eslint nous donne cet avertissement, ou cette

18
00:01:02,070 --> 00:01:04,160
‫erreur en fait, et il dit

19
00:01:04,160 --> 00:01:07,080
‫que nous devrions utiliser la déstructuration d'objet, d'accord ?

20
00:01:07,080 --> 00:01:09,620
‫Et donc je laisse cela se produire ici

21
00:01:09,620 --> 00:01:12,620
‫exprès juste pour que je puisse vous montrer comment nous

22
00:01:12,620 --> 00:01:14,950
‫pouvons le faire avec la déstructuration ES6.

23
00:01:14,950 --> 00:01:18,490
‫Et je pense en avoir déjà parlé dans le cours, et

24
00:01:18,490 --> 00:01:20,930
‫j'espère aussi que vous connaissez déjà le

25
00:01:20,930 --> 00:01:23,330
‫concept, mais de toute façon, puisque le

26
00:01:23,330 --> 00:01:25,430
‫nom de cette propriété ici

27
00:01:25,430 --> 00:01:27,920
‫est le même que le nom de

28
00:01:27,920 --> 00:01:30,260
‫la variable, on peut simplement le faire

29
00:01:30,260 --> 00:01:34,150
‫comme ceci et supprimez le nom de la propriété ici, d'accord ?

30
00:01:34,150 --> 00:01:36,520
‫Et aussi nous voulons obtenir le mot de passe.

31
00:01:36,520 --> 00:01:37,930
‫Et donc ce serait la même chose, donc

32
00:01:37,930 --> 00:01:42,470
‫fondamentalement, le mot de passe équivaut à une demande. corps. le mot de passe.

33
00:01:42,470 --> 00:01:43,647
‫Et au lieu

34
00:01:43,647 --> 00:01:47,940
‫de faire cela, nous pouvons simplement créer un e-mail et un mot de passe.

35
00:01:47,940 --> 00:01:50,250
‫Et donc juste comme ça,

36
00:01:50,250 --> 00:01:54,480
‫nous créons essentiellement ces deux variables de l'objet corps, d'accord ?

37
00:01:54,480 --> 00:01:56,380
‫Donc, en gros, c'est ainsi que

38
00:01:56,380 --> 00:02:00,223
‫l'utilisateur va envoyer les informations de connexion pour que nous puissions les vérifier.

39
00:02:01,070 --> 00:02:04,130
‫D'accord, et ce processus de vérification comporte quelques

40
00:02:04,130 --> 00:02:05,830
‫étapes, alors exposons-les ici

41
00:02:05,830 --> 00:02:07,750
‫avant de commencer à coder.

42
00:02:07,750 --> 00:02:12,030
‫Donc, nous devons d'abord vérifier si l'e-mail

43
00:02:12,030 --> 00:02:17,030
‫et les mots de passe existent réellement, d'accord ?

44
00:02:17,900 --> 00:02:22,900
‫Ensuite numéro deux, vérifiez si l'utilisateur existe, et en

45
00:02:24,440 --> 00:02:29,440
‫même temps si le mot de passe est correct.

46
00:02:31,960 --> 00:02:33,943
‫Et troisièmement, si tout

47
00:02:39,440 --> 00:02:44,440
‫va bien, renvoyez le jeton, donc le jeton Web JSON au client.

48
00:02:45,800 --> 00:02:48,490
‫D'accord, donc le premier est très facile.

49
00:02:48,490 --> 00:02:53,490
‫Donc, s'il n'y a pas d'email ou pas de mot de passe, alors

50
00:02:56,810 --> 00:03:00,370
‫nous voulons envoyer un message d'erreur à notre client.

51
00:03:00,370 --> 00:03:02,600
‫Maintenant, comment allons-nous faire ?

52
00:03:02,600 --> 00:03:04,490
‫Eh bien, nous allons le faire

53
00:03:04,490 --> 00:03:07,490
‫en utilisant les outils que nous avons implémentés dans la dernière section.

54
00:03:07,490 --> 00:03:10,730
‫Donc, en gros, notre erreur d'application, vous vous en souvenez ?

55
00:03:10,730 --> 00:03:12,977
‫Nous allons donc simplement créer une nouvelle

56
00:03:12,977 --> 00:03:15,060
‫erreur ici, et notre middleware

57
00:03:15,060 --> 00:03:19,190
‫global de gestion des erreurs la récupérera et renverra cette erreur au client.

58
00:03:19,190 --> 00:03:22,483
‫Et commençons donc par importer cette erreur.

59
00:03:23,350 --> 00:03:25,260
‫Alors rappelez-vous qu'il s'agit

60
00:03:25,260 --> 00:03:28,463
‫de celui-ci de notre classe AppError, n'est-ce pas ?

61
00:03:29,620 --> 00:03:34,620
‫Alors disons AppError, puis require.

62
00:03:40,860 --> 00:03:44,150
‫Donc un niveau supérieur à partir d'ici, puis dans les utilitaires,

63
00:03:44,150 --> 00:03:45,050
‫puis appError.

64
00:03:48,990 --> 00:03:52,430
‫D'accord, nous devons donc appeler le prochain middleware, et

65
00:03:52,430 --> 00:03:56,403
‫c'est là que nous passons l'erreur, vous vous en souvenez ?

66
00:03:57,260 --> 00:04:00,363
‫Donc nouvelle erreur AppError, et le message

67
00:04:02,510 --> 00:04:07,510
‫est : veuillez fournir une adresse e-mail et un mot de passe.

68
00:04:07,530 --> 00:04:12,530
‫Et le code d'erreur HTTP est 400 pour une mauvaise requête, d'accord ?

69
00:04:12,720 --> 00:04:14,340
‫Et maintenant, j'ai quelques

70
00:04:14,340 --> 00:04:19,090
‫erreurs ici, et c'est encore une fois eslint qui m'aide à corriger certains bogues.

71
00:04:19,090 --> 00:04:20,710
‫Donc je vois que

72
00:04:20,710 --> 00:04:24,010
‫là-haut, encore une fois, je l'ai utilisé avec un T au

73
00:04:24,010 --> 00:04:27,740
‫lieu de D, et si je le sauvegarde maintenant, tout est correct.

74
00:04:27,740 --> 00:04:32,393
‫D'accord, et commençons donc à tester cela tout de suite.

75
00:04:33,330 --> 00:04:34,700
‫Et pour cela

76
00:04:34,700 --> 00:04:39,700
‫je vais simplement commencer par créer un faux jeton ici pour le moment, d'accord.

77
00:04:39,930 --> 00:04:43,287
‫Et alors disons res. statut 200 pour d'accord.

78
00:04:51,202 --> 00:04:53,573
‫JSON, puis bien sûr, comme

79
00:04:56,540 --> 00:05:01,010
‫toujours, le statut défini sur succès, puis également notre jeton.

80
00:05:01,010 --> 00:05:02,870
‫Et c'est en fait tout ce que

81
00:05:02,870 --> 00:05:05,130
‫nous allons envoyer en réponse à la connexion, d'accord ?

82
00:05:05,130 --> 00:05:08,290
‫Donc pas d'objet utilisateur car ce n'est pas du tout nécessaire.

83
00:05:08,290 --> 00:05:10,800
‫Tout ce que nous voulons comme réponse pour la connexion,

84
00:05:10,800 --> 00:05:12,140
‫c'est en fait le jeton.

85
00:05:12,140 --> 00:05:15,033
‫C'est tout ce qui compte lorsque l'utilisateur se connecte.

86
00:05:16,210 --> 00:05:18,960
‫Ensuite, nous devons implémenter la

87
00:05:18,960 --> 00:05:23,600
‫route, alors faisons-le à nouveau dans notre routeur utilisateur, d'accord ?

88
00:05:23,600 --> 00:05:27,000
‫Et celui-ci est en fait assez similaire à celui-ci.

89
00:05:27,000 --> 00:05:30,310
‫Dupliquons-le, puis remplaçons l'inscription dans

90
00:05:30,310 --> 00:05:34,780
‫les deux cas ici par la connexion, d'accord ?

91
00:05:34,780 --> 00:05:38,220
‫Et encore une fois, cela n'est valable que pour une demande

92
00:05:38,220 --> 00:05:40,360
‫de publication, car nous souhaitons bien

93
00:05:40,360 --> 00:05:43,200
‫sûr envoyer les informations de connexion dans le corps.

94
00:05:43,200 --> 00:05:44,630
‫Et encore une fois, c'est

95
00:05:44,630 --> 00:05:47,610
‫un post, mais pas un get, pas un patch, et pas

96
00:05:47,610 --> 00:05:50,393
‫une suppression, car cela n'a aucun sens dans ce cas.

97
00:05:51,590 --> 00:05:54,033
‫Alors testons-le tout de suite.

98
00:05:54,970 --> 00:05:57,033
‫Je vais également copier cette URL ici.

99
00:05:58,050 --> 00:06:03,050
‫Ce sera la publication, la connexion, puis le corps

100
00:06:03,570 --> 00:06:05,140
‫bien sûr.

101
00:06:05,140 --> 00:06:08,700
‫Encore une fois, brut et JSON.

102
00:06:08,700 --> 00:06:11,443
‫Créons donc un corps simple ici.

103
00:06:17,680 --> 00:06:19,960
‫Très bien, essayons donc d'envoyer ceci

104
00:06:19,960 --> 00:06:22,993
‫sans mot de passe, et voyons ce qui se passe.

105
00:06:24,460 --> 00:06:27,470
‫Et en effet, cela fonctionne, nous recevons donc notre message ici :

106
00:06:27,470 --> 00:06:30,030
‫veuillez fournir une adresse e-mail et un mot de passe.

107
00:06:30,030 --> 00:06:31,820
‫Et encore une fois, puisque

108
00:06:31,820 --> 00:06:34,110
‫nous sommes en développement, nous obtenons toute

109
00:06:34,110 --> 00:06:36,910
‫cette pile d'erreurs ici, et l'erreur complète avec notre

110
00:06:36,910 --> 00:06:39,350
‫code d'état, l'état, et aussi bien sûr en

111
00:06:39,350 --> 00:06:41,330
‫disant qu'il s'agit d'une erreur opérationnelle.

112
00:06:41,330 --> 00:06:45,840
‫Donc, comme nous l'avons défini dans la section précédente, d'accord ?

113
00:06:45,840 --> 00:06:48,433
‫Essayons maintenant la même chose avec le mot de passe.

114
00:06:50,750 --> 00:06:55,750
‫Alors, définissez le mot de passe sur Je pense que c'était

115
00:06:56,400 --> 00:06:58,893
‫celui-ci, puis supprimez l'e-mail.

116
00:07:00,590 --> 00:07:02,950
‫Et cela déclenche bien sûr la même chose.

117
00:07:02,950 --> 00:07:06,000
‫D'accord, et avec tout ce qui est correct, cela devrait alors

118
00:07:06,000 --> 00:07:08,803
‫fonctionner, et en effet, nous obtenons notre faux jeton ici.

119
00:07:10,300 --> 00:07:12,890
‫Maintenant, une seule chose que nous devrions faire

120
00:07:12,890 --> 00:07:14,880
‫ici est de revenir également.

121
00:07:14,880 --> 00:07:16,790
‫Nous l'avons donc fait plusieurs fois auparavant,

122
00:07:16,790 --> 00:07:18,680
‫et permettez-moi de l'expliquer à nouveau.

123
00:07:18,680 --> 00:07:21,610
‫C'est simplement parce qu'après avoir appelé le prochain

124
00:07:21,610 --> 00:07:24,380
‫middleware, nous voulons nous assurer que cette

125
00:07:24,380 --> 00:07:27,873
‫fonction de connexion se termine tout de suite, d'accord ?

126
00:07:30,260 --> 00:07:32,080
‫Et comme nous n'avions pas

127
00:07:32,080 --> 00:07:34,560
‫cela auparavant, vous voyez à nouveau cette erreur ici.

128
00:07:34,560 --> 00:07:38,060
‫Donc, c'est déjà un peu familier à ce stade, n'est-ce pas ?

129
00:07:38,060 --> 00:07:40,940
‫Impossible donc de définir des en-têtes après leur envoi au client,

130
00:07:40,940 --> 00:07:43,360
‫car encore une fois, nous avons envoyé deux réponses.

131
00:07:43,360 --> 00:07:47,840
‫D'abord la réponse d'erreur, puis ce code exécuté ici, ce qui n'aurait bien

132
00:07:47,840 --> 00:07:50,040
‫sûr pas dû le faire.

133
00:07:50,040 --> 00:07:52,933
‫Et encore une fois, nous utilisons return here pour résoudre ce problème.

134
00:07:53,790 --> 00:07:57,430
‫Bon, maintenant, vérifions s'il y a réellement un utilisateur

135
00:07:57,430 --> 00:07:59,870
‫pour l'e-mail qui a été posté.

136
00:07:59,870 --> 00:08:04,870
‫Donc const user, et donc utilisons maintenant le findOne en fait, car cette

137
00:08:09,940 --> 00:08:13,400
‫fois nous ne sélectionnons pas un utilisateur par l'ID,

138
00:08:13,400 --> 00:08:16,650
‫mais plutôt par son email, n'est-ce pas ?

139
00:08:16,650 --> 00:08:19,460
‫Et donc nous devons passer cet objet

140
00:08:19,460 --> 00:08:24,190
‫de filtre où nous pouvons dire email égal à email, d'accord ?

141
00:08:24,190 --> 00:08:25,940
‫Le champ est donc appelé

142
00:08:25,940 --> 00:08:28,270
‫email, et la variable est également appelée email.

143
00:08:28,270 --> 00:08:32,163
‫Et donc dans ES6, nous pouvons abréger cela simplement comme ceci.

144
00:08:33,060 --> 00:08:34,490
‫Maintenant, avant de continuer ici,

145
00:08:34,490 --> 00:08:36,110
‫il y a en fait quelque

146
00:08:36,110 --> 00:08:38,520
‫chose d'important que je dois faire pour la sécurité.

147
00:08:38,520 --> 00:08:41,220
‫Alors laissez-moi vous montrer cela dans

148
00:08:41,220 --> 00:08:43,970
‫Postman, où nous avons ouvert un nouveau compte.

149
00:08:43,970 --> 00:08:46,540
‫Et donc vous voyez ici que dans la

150
00:08:46,540 --> 00:08:49,810
‫sortie utilisateur, nous obtenons en fait le mot de passe, d'accord ?

151
00:08:49,810 --> 00:08:52,010
‫Il est crypté en fait, mais ce

152
00:08:52,010 --> 00:08:55,010
‫n'est quand même pas une bonne pratique de divulguer les

153
00:08:55,010 --> 00:08:57,710
‫données du mot de passe au client, d'accord ?

154
00:08:57,710 --> 00:09:01,090
‫Par exemple, si nous avions notre get all users ici,

155
00:09:01,090 --> 00:09:03,480
‫et que cette route n'est pas encore

156
00:09:03,480 --> 00:09:07,170
‫implémentée, mais si nous devions obtenir tous les utilisateurs de la collection,

157
00:09:07,170 --> 00:09:09,440
‫alors tous auraient le mot de

158
00:09:09,440 --> 00:09:12,720
‫passe visible, et nous ne voulons pas que , d'accord?

159
00:09:12,720 --> 00:09:15,790
‫Et donc le réparer est en fait assez facile,

160
00:09:15,790 --> 00:09:17,850
‫car nous l'avons fait avant.

161
00:09:17,850 --> 00:09:19,973
‫Tout ce que nous avons à faire

162
00:09:20,820 --> 00:09:25,270
‫est de dire le mot de passe, puis de le sélectionner et de le définir sur faux.

163
00:09:25,270 --> 00:09:28,100
‫Et donc comme ça, il n'apparaîtra automatiquement dans

164
00:09:28,100 --> 00:09:29,123
‫aucune sortie.

165
00:09:30,520 --> 00:09:32,520
‫Et de me laisser

166
00:09:32,520 --> 00:09:37,023
‫vous prouver cela en vous inscrivant comme autre chose, donc comme ça.

167
00:09:39,070 --> 00:09:41,920
‫Et voyons, oh, en fait, nous avons

168
00:09:41,920 --> 00:09:45,833
‫déjà un utilisateur avec cet e-mail, alors faisons juste test3.

169
00:09:47,300 --> 00:09:50,830
‫Et maintenant, le mot de passe est toujours là, mais je suppose

170
00:09:50,830 --> 00:09:54,100
‫que c'est simplement parce que nous pourrions simplement le créer, ce

171
00:09:54,100 --> 00:09:55,610
‫nouveau document ici, et

172
00:09:55,610 --> 00:09:58,030
‫donc il ne le sélectionne pas vraiment parce

173
00:09:58,030 --> 00:10:01,460
‫que nous ne le lisons pas dans la base de données.

174
00:10:01,460 --> 00:10:03,250
‫Implémentons donc très

175
00:10:03,250 --> 00:10:05,100
‫rapidement cette route ici,

176
00:10:05,100 --> 00:10:07,690
‫cela ne prendra qu'une minute.

177
00:10:07,690 --> 00:10:10,300
‫Donc juste pour voir si cela fonctionne réellement ici.

178
00:10:10,300 --> 00:10:12,230
‫Parce que cette étape est en

179
00:10:12,230 --> 00:10:15,170
‫fait importante pour ce que nous allons faire ensuite, d'accord ?

180
00:10:15,170 --> 00:10:18,820
‫Alors allons-y et copions ce code à partir de getAllTours,

181
00:10:18,820 --> 00:10:22,000
‫et pas vraiment, mais ce que nous allons faire

182
00:10:22,000 --> 00:10:25,133
‫est assez similaire à cela bien sûr.

183
00:10:26,750 --> 00:10:28,590
‫Je vais donc simplement copier

184
00:10:28,590 --> 00:10:30,450
‫ceci, mais sans les fonctionnalités de l'API.

185
00:10:30,450 --> 00:10:33,700
‫Donc ça ne m'intéresse pas vraiment, d'accord ?

186
00:10:33,700 --> 00:10:35,500
‫Et donc celui-ci que

187
00:10:35,500 --> 00:10:39,170
‫je vais faire dans le contrôleur utilisateur, car obtenir tous les

188
00:10:39,170 --> 00:10:41,350
‫utilisateurs n'a rien à voir avec l'authentification.

189
00:10:41,350 --> 00:10:43,570
‫Et donc dans ce cas,

190
00:10:43,570 --> 00:10:47,020
‫le contrôleur utilisateur est l'endroit idéal pour le faire.

191
00:10:47,020 --> 00:10:49,440
‫Maintenant, bien sûr, j'ai également besoin d'importer

192
00:10:49,440 --> 00:10:51,990
‫rapidement le modèle utilisateur ici, et nous allons

193
00:10:51,990 --> 00:10:56,580
‫donc également le copier à partir du tourController, qui n'est pas le même mais similaire.

194
00:10:56,580 --> 00:11:00,550
‫Alors saisissons en fait tout cela dans

195
00:11:04,200 --> 00:11:06,370
‫notre contrôleur utilisateur.

196
00:11:06,370 --> 00:11:09,683
‫Nous n'avons pas besoin de celui-ci, mais nous devons également catchAsync.

197
00:11:10,520 --> 00:11:13,640
‫OK, donc la tournée sera

198
00:11:13,640 --> 00:11:18,400
‫user, et ici ce sera userModel, d'accord ?

199
00:11:18,400 --> 00:11:21,420
‫Ensuite, ici, nous avons des visites, et ici et ici,

200
00:11:21,420 --> 00:11:23,790
‫alors j'appuie sur Commande + D pour les

201
00:11:23,790 --> 00:11:26,033
‫sélectionner toutes et les changer en utilisateurs.

202
00:11:27,190 --> 00:11:32,190
‫Et puis ici bien sûr ce que nous attendons, c'est User. trouve.

203
00:11:34,870 --> 00:11:36,320
‫Maintenant que nous

204
00:11:36,320 --> 00:11:41,310
‫avons un wait ici, nous avons besoin d'async, puis nous avons également besoin de next,

205
00:11:41,310 --> 00:11:42,810
‫et puisque nous avons un

206
00:11:42,810 --> 00:11:46,580
‫async ici, nous devrions alors envelopper le tout dans un catch async.

207
00:11:46,580 --> 00:11:47,713
‫Alors faisons-le.

208
00:11:50,090 --> 00:11:51,700
‫D'accord, et à ce

209
00:11:51,700 --> 00:11:53,810
‫stade, ce n'est plus nouveau pour vous,

210
00:11:53,810 --> 00:11:58,120
‫nous sommes déjà habitués à faire ce genre de choses, n'est-ce pas ?

211
00:11:58,120 --> 00:12:00,670
‫Donc, cela devrait déjà fonctionner à

212
00:12:00,670 --> 00:12:02,470
‫ce stade, alors essayons-le.

213
00:12:02,470 --> 00:12:06,460
‫Récupérez donc tous les utilisateurs, et maintenant, en effet, nous voyons que

214
00:12:06,460 --> 00:12:10,030
‫leur mot de passe n'est pas inclus dans la sortie.

215
00:12:10,030 --> 00:12:13,853
‫Et c'est important parce qu'en fait, dans la recherche, donc de

216
00:12:15,090 --> 00:12:17,093
‫retour ici dans AuthController, celui-ci

217
00:12:18,030 --> 00:12:21,490
‫ne contiendra désormais plus le mot de passe, d'accord ?

218
00:12:21,490 --> 00:12:23,060
‫Et donc la sortie de

219
00:12:23,060 --> 00:12:25,920
‫ceci ici ne contiendra désormais plus le mot de passe.

220
00:12:25,920 --> 00:12:28,890
‫Mais nous avons besoin du mot de passe pour vérifier

221
00:12:28,890 --> 00:12:30,810
‫s'il est correct, n'est-ce pas ?

222
00:12:30,810 --> 00:12:34,500
‫Et donc nous devons également le sélectionner explicitement.

223
00:12:34,500 --> 00:12:37,460
‫Alors, rappelez-vous comment nous utilisions select auparavant pour

224
00:12:37,460 --> 00:12:40,150
‫sélectionner simplement quelques champs de la base

225
00:12:40,150 --> 00:12:43,450
‫de données, uniquement ceux dont nous avions besoin ?

226
00:12:43,450 --> 00:12:45,460
‫Maintenant, dans ce cas, lorsque nous

227
00:12:45,460 --> 00:12:47,640
‫voulons que le champ qui est par défaut

228
00:12:47,640 --> 00:12:50,853
‫n'est pas sélectionné, nous devons user plus puis le nom du champ.

229
00:12:51,720 --> 00:12:53,610
‫Donc mot de passe dans ce cas.

230
00:12:53,610 --> 00:12:58,220
‫Et donc comme ça, il sera de retour dans la sortie, d'accord ?

231
00:12:58,220 --> 00:13:01,750
‫Bien sûr, nous devons attendre

232
00:13:01,750 --> 00:13:06,260
‫cette requête, puis marquer la fonction comme asynchrone.

233
00:13:06,260 --> 00:13:08,140
‫Et puis

234
00:13:08,140 --> 00:13:12,010
‫comme avant, afin d'éviter ce bloc try

235
00:13:12,010 --> 00:13:16,253
‫catch laid, enveloppez toute cette fonction dans catchAsync.

236
00:13:18,520 --> 00:13:20,163
‫D'accord, c'est logique ?

237
00:13:22,170 --> 00:13:26,770
‫Alors maintenant, connectons rapidement l'utilisateur à la console, juste pour voir

238
00:13:26,770 --> 00:13:28,353
‫si cela fonctionne.

239
00:13:32,220 --> 00:13:34,033
‫Alors celui-ci ici.

240
00:13:35,460 --> 00:13:39,600
‫Nous obtenons notre succès, et en effet nous obtenons l'utilisateur ici.

241
00:13:39,600 --> 00:13:42,650
‫Donc, avec exactement l'e-mail que je viens de publier,

242
00:13:42,650 --> 00:13:45,830
‫le mot de passe est maintenant également de nouveau inclus

243
00:13:45,830 --> 00:13:47,890
‫dans la sortie, d'accord ?

244
00:13:47,890 --> 00:13:51,453
‫Et encore une fois, c'est parce que nous l'avons explicitement sélectionné ici.

245
00:13:52,490 --> 00:13:54,950
‫Et maintenant, il est temps de comparer les mots

246
00:13:54,950 --> 00:13:57,400
‫de passe que nous avons dans la base de

247
00:13:57,400 --> 00:13:59,830
‫données avec celui que l'utilisateur vient de publier.

248
00:13:59,830 --> 00:14:01,930
‫Mais comment va-t-on faire ça ?

249
00:14:01,930 --> 00:14:05,190
‫Parce que, par exemple, le mot de

250
00:14:05,190 --> 00:14:09,169
‫passe peut être, ou est dans cet exemple, pass1234,

251
00:14:09,169 --> 00:14:13,983
‫mais celui que nous avons stocké dans le document ressemble à ceci.

252
00:14:15,040 --> 00:14:17,220
‫Alors, comment allons-nous comparer cela?

253
00:14:17,220 --> 00:14:19,960
‫Il n'y a pas vraiment moyen de le faire, non?

254
00:14:19,960 --> 00:14:22,300
‫Mais en fait, tout ce que nous

255
00:14:22,300 --> 00:14:25,890
‫avons à faire est d'utiliser à nouveau le package bcrypt, d'accord ?

256
00:14:25,890 --> 00:14:29,400
‫Nous avons donc utilisé bcrypt pour générer ce mot de passe haché, et

257
00:14:29,400 --> 00:14:31,230
‫nous pouvons également utiliser le même

258
00:14:31,230 --> 00:14:34,930
‫package pour comparer essentiellement un mot de passe d'origine comme celui-ci ici avec le

259
00:14:34,930 --> 00:14:36,283
‫mot de passe haché.

260
00:14:37,230 --> 00:14:40,700
‫Bien sûr, ce mot de passe ici, puisqu'il est crypté, il n'y

261
00:14:40,700 --> 00:14:43,350
‫a aucun moyen de récupérer l'ancien, donc

262
00:14:43,350 --> 00:14:46,680
‫le mot de passe d'origine de cette chaîne, n'est-ce pas ?

263
00:14:46,680 --> 00:14:48,150
‫C'est donc tout

264
00:14:48,150 --> 00:14:50,550
‫l'intérêt du chiffrement d'un mot de passe.

265
00:14:50,550 --> 00:14:52,410
‫Et donc la seule

266
00:14:52,410 --> 00:14:54,890
‫façon de le faire est que

267
00:14:54,890 --> 00:14:58,100
‫ce package pour cet algorithme crypte également ce

268
00:14:58,100 --> 00:15:02,210
‫mot de passe, puis le compare avec celui crypté, d'accord ?

269
00:15:02,210 --> 00:15:05,110
‫Implémentons donc une fonction qui va faire cela,

270
00:15:05,110 --> 00:15:08,350
‫et pour cela nous utiliserons, encore une fois, le package bcrypt.

271
00:15:08,350 --> 00:15:11,280
‫Et nous le ferons dans le modèle utilisateur.

272
00:15:11,280 --> 00:15:13,767
‫Et vous pourriez demander « Pourquoi le faisons-nous

273
00:15:13,767 --> 00:15:16,310
‫dans un modèle » et pas seulement ici », mais

274
00:15:16,310 --> 00:15:19,730
‫c'est, encore une fois, parce que cela est vraiment lié aux données elles-mêmes.

275
00:15:19,730 --> 00:15:22,930
‫Et aussi, nous avons déjà ce package là-dedans, et il

276
00:15:22,930 --> 00:15:26,090
‫est donc plus facile de le faire simplement là-bas.

277
00:15:26,090 --> 00:15:28,663
‫Alors, débarrassons-nous simplement de cette chaîne, puis créons

278
00:15:30,600 --> 00:15:32,360
‫une fonction ici, qui

279
00:15:32,360 --> 00:15:34,580
‫vérifiera si le mot de passe donné

280
00:15:34,580 --> 00:15:37,473
‫est le même que celui stocké dans le document.

281
00:15:38,520 --> 00:15:41,100
‫Donc, pour la première fois, nous allons créer quelque

282
00:15:41,100 --> 00:15:43,000
‫chose appelé une méthode d'instance.

283
00:15:43,000 --> 00:15:46,120
‫Donc, une méthode d'instance est fondamentalement une méthode

284
00:15:46,120 --> 00:15:48,500
‫qui sera disponible sur tous les documents

285
00:15:48,500 --> 00:15:50,843
‫d'une certaine collection, d'accord ?

286
00:15:51,680 --> 00:15:53,320
‫Et ça marche comme ça.

287
00:15:53,320 --> 00:15:56,120
‫Encore une fois, c'est défini

288
00:15:56,120 --> 00:16:01,050
‫sur un userSchema, puis nous disons méthodes, et maintenant dans ce

289
00:16:01,050 --> 00:16:05,273
‫cas nous voulons appeler la fonction correctPassword, d'accord ?

290
00:16:10,340 --> 00:16:12,810
‫Donc fonction, maintenant cette fonction va accepter un

291
00:16:12,810 --> 00:16:14,470
‫candidatPassword, donc le mot

292
00:16:17,734 --> 00:16:19,650
‫de passe que l'utilisateur passe dans

293
00:16:19,650 --> 00:16:22,347
‫le corps, et puis aussi le userPassword, d'accord ?

294
00:16:26,010 --> 00:16:28,590
‫Désormais, à l'intérieur de ces méthodes

295
00:16:28,590 --> 00:16:31,470
‫instanciées, puisqu'elles sont disponibles sur le document,

296
00:16:31,470 --> 00:16:35,430
‫le mot-clé this pointe en fait vers le document actuel.

297
00:16:35,430 --> 00:16:37,610
‫Mais dans ce cas, puisque nous avons

298
00:16:37,610 --> 00:16:42,080
‫le mot de passe défini pour sélectionner false, alors c'est ici, vous vous souvenez ?

299
00:16:42,080 --> 00:16:43,690
‫D'accord, et à

300
00:16:43,690 --> 00:16:47,920
‫cause de ça, ça. le mot de passe ne sera pas disponible.

301
00:16:47,920 --> 00:16:50,780
‫Donc, idéalement, nous le ferions comme ceci, et

302
00:16:50,780 --> 00:16:52,360
‫de cette façon,

303
00:16:52,360 --> 00:16:56,130
‫nous n'aurions qu'à passer le candidatPassword et non le userPassword.

304
00:16:56,130 --> 00:16:58,690
‫Mais encore une fois, ce n'est pas possible pour

305
00:16:58,690 --> 00:17:02,350
‫le moment car le mot de passe n'est pas disponible dans la sortie.

306
00:17:02,350 --> 00:17:03,420
‫Et c'est

307
00:17:03,420 --> 00:17:06,380
‫pourquoi nous devons également transmettre userPassword.

308
00:17:06,380 --> 00:17:07,890
‫Le but de cette

309
00:17:07,890 --> 00:17:11,030
‫fonction est donc de ne renvoyer que vrai ou faux.

310
00:17:11,030 --> 00:17:14,000
‫Donc fondamentalement vrai si les mots de passe sont

311
00:17:14,000 --> 00:17:15,663
‫les mêmes, et faux sinon.

312
00:17:16,560 --> 00:17:21,410
‫Alors revenez, puis bcrypt que nous connaissons déjà, puis nous

313
00:17:21,410 --> 00:17:26,257
‫allons utiliser la fonction de comparaison, d'accord ?

314
00:17:26,257 --> 00:17:29,190
‫Et la fonction de comparaison est

315
00:17:29,190 --> 00:17:32,200
‫vraiment simple, tout ce dont nous avons besoin

316
00:17:32,200 --> 00:17:37,060
‫est de passer le candidatPassword et le userPassword, pas userSchema, userPassword, d'accord ?

317
00:17:39,270 --> 00:17:42,090
‫Et tout comme la fonction de

318
00:17:42,090 --> 00:17:45,383
‫hachage ici, celle-ci est également une fonction asynchrone.

319
00:17:46,270 --> 00:17:50,973
‫Et donc, comme avant, nous utilisons wait, puis ici async.

320
00:17:53,330 --> 00:17:54,940
‫D'accord, ça a du sens ?

321
00:17:54,940 --> 00:17:57,630
‫Donc encore une fois, cette fonction de comparaison

322
00:17:57,630 --> 00:17:59,800
‫ici retournera très simplement vrai

323
00:17:59,800 --> 00:18:04,470
‫si ces deux mots de passe ici sont les mêmes, et faux sinon.

324
00:18:04,470 --> 00:18:07,030
‫Et encore une fois, nous ne

325
00:18:07,030 --> 00:18:10,020
‫pouvons pas les comparer manuellement car le mot de

326
00:18:10,020 --> 00:18:12,800
‫passe candidat n'est pas haché, c'est donc le mot

327
00:18:12,800 --> 00:18:15,580
‫de passe d'origine provenant de l'utilisateur, mais userPassword

328
00:18:15,580 --> 00:18:18,230
‫est bien sûr haché, et donc sans cette

329
00:18:18,230 --> 00:18:21,830
‫fonction ici, nous n'aurions aucun moyen de les comparer, d'accord ?

330
00:18:21,830 --> 00:18:23,990
‫Donc ici, nous retournons true ou false,

331
00:18:23,990 --> 00:18:26,893
‫maintenant tout ce que nous avons à faire est d'appeler

332
00:18:26,893 --> 00:18:28,633
‫cette fonction dans le authController.

333
00:18:29,920 --> 00:18:31,873
‫Fermons-en quelques-uns.

334
00:18:34,080 --> 00:18:38,253
‫Très bien, donc c'était ici seulement pour la démonstration.

335
00:18:41,400 --> 00:18:43,563
‫Appelons simplement ceci ici correctement, et rappelons-nous

336
00:18:44,400 --> 00:18:47,110
‫maintenant que la fonction que nous venons de définir

337
00:18:47,110 --> 00:18:48,670
‫est une méthode instanciée.

338
00:18:48,670 --> 00:18:52,260
‫Elle est donc disponible sur tous les documents utilisateurs.

339
00:18:52,260 --> 00:18:54,780
‫Et donc cette variable ici en ce moment

340
00:18:54,780 --> 00:18:57,050
‫est un document utilisateur, n'est-ce pas ?

341
00:18:57,050 --> 00:19:00,270
‫Parce que c'est le résultat de l'interrogation du modèle utilisateur.

342
00:19:00,270 --> 00:19:03,637
‫Et donc nous pouvons maintenant dire utilisateur. mot de passe correct.

343
00:19:06,760 --> 00:19:10,650
‫Maintenant, tout ce que nous avons à faire est de transmettre le mot de passe

344
00:19:10,650 --> 00:19:13,020
‫candidat, qui est le mot de passe, rappelez-vous.

345
00:19:13,020 --> 00:19:17,830
‫Donc celui-ci ici, puis le userPassword.

346
00:19:17,830 --> 00:19:22,830
‫Et donc c'est dans user. mot de passe, d'accord ?

347
00:19:23,450 --> 00:19:26,373
‫Et donc ceci ici sera maintenant soit vrai, soit faux.

348
00:19:27,990 --> 00:19:30,810
‫Très bien, et maintenant utilisons ces deux variables afin

349
00:19:30,810 --> 00:19:33,500
‫de déterminer si l'utilisateur existe et si le

350
00:19:33,500 --> 00:19:35,200
‫mot de passe est correct.

351
00:19:35,200 --> 00:19:36,710
‫Nous avons donc déjà

352
00:19:36,710 --> 00:19:40,390
‫compris cela, mais maintenant nous devons réellement écrire notre instruction if.

353
00:19:40,390 --> 00:19:45,390
‫Donc, s'il n'y a pas d'utilisateur ou si le mot de passe est incorrect,

354
00:19:46,160 --> 00:19:49,853
‫alors fondamentalement correct est faux, c'est ce que cela signifie.

355
00:19:50,860 --> 00:19:54,590
‫Dans ce cas, nous voulons, encore une fois,

356
00:19:54,590 --> 00:19:58,640
‫revenir et passer directement à notre prochain middleware avec une

357
00:19:58,640 --> 00:19:59,640
‫nouvelle AppError.

358
00:20:00,980 --> 00:20:05,973
‫Et dans ce cas, dire un e-mail ou un mot de passe incorrect, d'accord ?

359
00:20:08,990 --> 00:20:11,560
‫Et puis le code d'état est

360
00:20:11,560 --> 00:20:14,870
‫401, ce qui signifie non autorisé, d'accord ?

361
00:20:14,870 --> 00:20:16,910
‫Maintenant, nous aurions pu le faire

362
00:20:16,910 --> 00:20:18,847
‫séparément, alors vérifiez d'abord

363
00:20:18,847 --> 00:20:21,440
‫l'utilisateur, puis le mot de passe correct.

364
00:20:21,440 --> 00:20:24,600
‫Mais dans ce cas, nous donnerions alors à un

365
00:20:24,600 --> 00:20:28,710
‫attaquant potentiel des informations indiquant si l'e-mail ou le mot de passe est incorrect.

366
00:20:28,710 --> 00:20:31,550
‫Et comme ça ici c'est un peu plus vague.

367
00:20:31,550 --> 00:20:34,830
‫Nous ne spécifions donc pas vraiment ce qui est incorrect ici.

368
00:20:34,830 --> 00:20:37,060
‫Donc si c'est l'email ou si c'est le mot de passe.

369
00:20:37,060 --> 00:20:38,700
‫Et donc s'il y a

370
00:20:38,700 --> 00:20:41,150
‫un attaquant qui essaie de mettre des données aléatoires,

371
00:20:41,150 --> 00:20:43,640
‫alors ils ne sauront pas si l'e-mail existe réellement,

372
00:20:43,640 --> 00:20:47,143
‫ou si c'est juste le mot de passe qui est faux, d'accord ?

373
00:20:47,990 --> 00:20:50,860
‫Maintenant, juste deux choses ici, et la première

374
00:20:50,860 --> 00:20:53,140
‫est que nous devons en

375
00:20:53,140 --> 00:20:55,480
‫fait attendre cette fonction asynchrone, d'accord ?

376
00:20:55,480 --> 00:20:57,470
‫Rappelez-vous donc que le mot de passe

377
00:20:57,470 --> 00:20:59,000
‫correct est une fonction asynchrone,

378
00:20:59,000 --> 00:21:01,333
‫et donc ici, nous devons également attendre cela.

379
00:21:02,690 --> 00:21:04,530
‫Et puis il y a aussi

380
00:21:04,530 --> 00:21:06,980
‫un autre problème, car cet utilisateur n'existe pas

381
00:21:06,980 --> 00:21:10,950
‫ici, alors cette prochaine ligne de code ne peut pas vraiment s'exécuter, d'accord ?

382
00:21:10,950 --> 00:21:13,550
‫Parce que par exemple, user. le mot de

383
00:21:13,550 --> 00:21:15,400
‫passe ne sera pas disponible.

384
00:21:15,400 --> 00:21:18,800
‫Et donc nous devons en fait déplacer tout cela,

385
00:21:18,800 --> 00:21:20,690
‫ou en fait uniquement ce

386
00:21:20,690 --> 00:21:24,343
‫code, nous allons le déplacer ici dans l'instruction if else.

387
00:21:26,740 --> 00:21:29,000
‫D'accord, et ainsi de cette façon, si

388
00:21:29,000 --> 00:21:32,550
‫l'utilisateur n'existe pas, donc si c'est vrai, alors il n'exécutera même

389
00:21:32,550 --> 00:21:34,900
‫pas ce code ici, et alors il

390
00:21:34,900 --> 00:21:37,070
‫n'y aura pas de problème.

391
00:21:37,070 --> 00:21:40,510
‫Mais si l'utilisateur existe, il exécutera également ce code et vérifiera

392
00:21:40,510 --> 00:21:43,600
‫si le mot de passe est réellement correct.

393
00:21:43,600 --> 00:21:45,520
‫Et donc si le mot de

394
00:21:45,520 --> 00:21:50,010
‫passe est correct, ce n'est que dans ce cas que nous atteignons ce morceau de code ici.

395
00:21:50,010 --> 00:21:52,710
‫C'est donc toute l'idée de cette fonction.

396
00:21:52,710 --> 00:21:55,030
‫Donc, en gros, nous vérifions les points négatifs.

397
00:21:55,030 --> 00:21:57,270
‫Donc, s'il n'y a pas d'e-mail et pas de mot

398
00:21:57,270 --> 00:21:58,880
‫de passe, nous obtenons cette erreur.

399
00:21:58,880 --> 00:22:01,690
‫S'il n'y a pas d'utilisateur ou s'il y a un mauvais

400
00:22:01,690 --> 00:22:03,540
‫mot de passe, créez cette erreur.

401
00:22:03,540 --> 00:22:05,610
‫Mais s'il n'y a eu aucune

402
00:22:05,610 --> 00:22:09,060
‫erreur, eh bien, dans ce cas, nous atteignons cette partie du

403
00:22:09,060 --> 00:22:10,820
‫code, où nous générons maintenant

404
00:22:10,820 --> 00:22:13,490
‫un jeton, puis nous le renvoyons à l'utilisateur.

405
00:22:13,490 --> 00:22:16,740
‫Maintenant, la création de ce jeton va être exactement la même chose

406
00:22:16,740 --> 00:22:18,500
‫que nous l'avons fait avant ici.

407
00:22:18,500 --> 00:22:20,780
‫Et donc au lieu de répéter tout

408
00:22:20,780 --> 00:22:24,210
‫ce code, créons en fait une fonction pour cela, d'accord ?

409
00:22:24,210 --> 00:22:25,840
‫Je vais donc

410
00:22:25,840 --> 00:22:29,427
‫copier ce code, puis ici très rapidement const

411
00:22:31,900 --> 00:22:36,090
‫signToken, qui va recevoir comme seule entrée l'ID utilisateur.

412
00:22:36,090 --> 00:22:41,090
‫Donc ID, et il renverra ensuite le jeton, d'accord ?

413
00:22:43,370 --> 00:22:46,793
‫Il va donc simplement signer ceci et le retourner tout de suite.

414
00:22:47,700 --> 00:22:50,920
‫Très bien, et donc ici, ce que

415
00:22:50,920 --> 00:22:55,920
‫nous allons faire, c'est signer le jeton et transmettre cet identifiant.

416
00:23:04,970 --> 00:23:09,330
‫Et puis, bien sûr, nous devons également le changer ici, d'accord ?

417
00:23:09,330 --> 00:23:11,750
‫Définissez donc cet ID sur cet ID, qui, comme

418
00:23:11,750 --> 00:23:14,893
‫vous le savez déjà à ce stade, est le même que celui-ci.

419
00:23:15,950 --> 00:23:19,763
‫Très bien, alors allons-y maintenant et faisons de même ici.

420
00:23:22,547 --> 00:23:26,340
‫signToken, et dans ce cas c'est user. _identifiant.

421
00:23:31,300 --> 00:23:33,910
‫Ouf, c'était une longue

422
00:23:33,910 --> 00:23:37,090
‫conférence, allons-y maintenant et essayons-la.

423
00:23:37,090 --> 00:23:38,363
‫Cela devrait donc maintenant fonctionner.

424
00:23:39,250 --> 00:23:43,470
‫Alors rappelez-vous, eh bien, c'est maintenant un autre utilisateur, mais je sais que c'est

425
00:23:43,470 --> 00:23:46,030
‫le mot de passe que j'ai utilisé.

426
00:23:46,030 --> 00:23:48,580
‫Alors pour l'instant, utilisons-en un autre,

427
00:23:48,580 --> 00:23:52,003
‫alors testez 12, et voyons ce qui se passe.

428
00:23:53,540 --> 00:23:57,450
‫Attendons, et en effet, e-mail ou mot de passe incorrect.

429
00:23:57,450 --> 00:24:00,230
‫Et donc nous obtenons bien sûr aussi notre

430
00:24:00,230 --> 00:24:04,600
‫401, et en effet cela signifie que notre code teste déjà le mot

431
00:24:04,600 --> 00:24:05,933
‫de passe actuellement.

432
00:24:06,780 --> 00:24:10,230
‫Donc, si nous choisissons maintenant le bon mot de passe,

433
00:24:10,230 --> 00:24:12,793
‫alors il devrait passer, alors attendons-le.

434
00:24:13,760 --> 00:24:16,760
‫Mais, nous obtenons toujours cette erreur.

435
00:24:16,760 --> 00:24:20,453
‫Eh bien, débarrassons-nous simplement de tous nos utilisateurs ici, juste

436
00:24:22,170 --> 00:24:24,420
‫pour nous assurer que cela

437
00:24:24,420 --> 00:24:28,740
‫n'a rien à faire avec les utilisateurs, puis créons-en un nouveau, d'accord.

438
00:24:33,080 --> 00:24:37,473
‫Alors bonjour@jonas, et pass1234.

439
00:24:38,710 --> 00:24:42,373
‫Allons-y et copiez-le, je vais l'envoyer maintenant.

440
00:24:46,800 --> 00:24:50,070
‫Et donc ces informations d'identification sont maintenant correctes à coup sûr.

441
00:24:50,070 --> 00:24:52,760
‫Donc, si cela ne fonctionne pas maintenant, il y a une sorte de bogue.

442
00:24:52,760 --> 00:24:55,870
‫Mais maintenant, en fait, cela a fonctionné, super.

443
00:24:55,870 --> 00:25:00,090
‫Voici donc notre jeton, et il ressemble exactement à avant, nous

444
00:25:00,090 --> 00:25:02,483
‫pouvons donc supposer qu'il est correct.

445
00:25:03,570 --> 00:25:06,333
‫Essayons maintenant à nouveau, en supprimant ceci, d'accord.

446
00:25:07,810 --> 00:25:10,753
‫Et donc avec un mauvais mot de passe ça ne marche pas.

447
00:25:11,890 --> 00:25:15,423
‫Mettons maintenant le mot de passe correct et l'email incorrect, puis nous

448
00:25:18,230 --> 00:25:19,730
‫obtenons la même erreur.

449
00:25:19,730 --> 00:25:21,883
‫Donc email ou mot de passe incorrect.

450
00:25:22,930 --> 00:25:25,560
‫Et encore une fois, si nous remettons tout en

451
00:25:25,560 --> 00:25:27,560
‫place, nous obtenons un nouveau jeton.

452
00:25:27,560 --> 00:25:30,810
‫Et donc nous sommes maintenant vraiment connectés à l'application.

453
00:25:30,810 --> 00:25:33,580
‫Et je sais que cela peut sembler un peu abstrait,

454
00:25:33,580 --> 00:25:37,340
‫donc tout ce que nous obtenons vraiment est un jeton, et cela signifie que

455
00:25:37,340 --> 00:25:40,020
‫nous sommes connectés à l'application, n'est-ce pas ?

456
00:25:40,020 --> 00:25:44,720
‫Mais bon, c'est comme ça que ça marche sur l'authentification sans état.

457
00:25:44,720 --> 00:25:47,810
‫Plus tard, lorsque nous créerons vraiment le site Web

458
00:25:47,810 --> 00:25:50,190
‫dynamique, il sera bien sûr beaucoup

459
00:25:50,190 --> 00:25:53,900
‫plus visible si l'utilisateur est connecté ou déconnecté, n'est-ce pas ?

460
00:25:53,900 --> 00:25:55,920
‫Mais cela fonctionnera toujours dans les coulisses

461
00:25:55,920 --> 00:25:57,670
‫en utilisant ce même jeton.

462
00:25:57,670 --> 00:26:01,560
‫Donc, s'il n'y a pas de jeton, le site Web aura une apparence

463
00:26:01,560 --> 00:26:03,800
‫dans un sens, et s'il y a

464
00:26:03,800 --> 00:26:06,630
‫un jeton, le site Web aura une autre apparence,

465
00:26:06,630 --> 00:26:11,150
‫avec l'image de l'utilisateur et le nom d'utilisateur directement sur le site Web, par exemple.

466
00:26:11,150 --> 00:26:13,373
‫Quoi qu'il en soit, ce fut une assez longue conférence.

467
00:26:14,370 --> 00:26:17,100
‫Assurez-vous de revenir ici et d'essayer vraiment de

468
00:26:17,100 --> 00:26:20,210
‫comprendre tout ce code que nous avons ici, d'accord ?

469
00:26:20,210 --> 00:26:21,870
‫Parce que je sais que certains

470
00:26:21,870 --> 00:26:23,660
‫de ces éléments peuvent être un peu déroutants.

471
00:26:23,660 --> 00:26:26,963
‫Par exemple, cette fonction correctPassword ici.

472
00:26:27,850 --> 00:26:30,933
‫Et puis je suis sûr que tout aura un sens pour vous.

