﻿1
00:00:01,120 --> 00:00:02,370
‫Instrutor: Então, nesta

2
00:00:02,370 --> 00:00:06,430
‫aula, vamos gerenciar as senhas de nossos usuários no banco de dados.

3
00:00:06,430 --> 00:00:08,790
‫E com isso, quero primeiro validar

4
00:00:08,790 --> 00:00:12,660
‫se a senha inserida é igual à senha confirmada e,

5
00:00:12,660 --> 00:00:16,380
‫em seguida, também criptografar a senha no banco de

6
00:00:16,380 --> 00:00:18,633
‫dados para protegê-la contra ataques.

7
00:00:20,320 --> 00:00:22,330
‫E então a primeira coisa

8
00:00:22,330 --> 00:00:26,690
‫que faremos é validar se as duas senhas inseridas são iguais.

9
00:00:26,690 --> 00:00:28,840
‫E o melhor lugar para

10
00:00:28,840 --> 00:00:31,760
‫fazer isso é aqui na senha de confirmação, ok?

11
00:00:31,760 --> 00:00:36,283
‫E então vamos escrever nosso validador customizado para isso, certo?

12
00:00:38,480 --> 00:00:41,890
‫Então lembre-se, usamos a propriedade validate e como

13
00:00:41,890 --> 00:00:44,270
‫queremos criar uma função e

14
00:00:44,270 --> 00:00:48,420
‫também uma mensagem de erro, vamos abrir um novo objeto

15
00:00:49,480 --> 00:00:51,990
‫aqui e ali criar um validador,

16
00:00:51,990 --> 00:00:53,920
‫que será a

17
00:00:53,920 --> 00:00:56,370
‫função e vamos começar com este.

18
00:00:56,370 --> 00:00:58,780
‫Portanto, lembre-se, tudo o que precisamos aqui é especificar

19
00:00:58,780 --> 00:01:01,770
‫uma função de retorno de chamada simples que será chamada

20
00:01:01,770 --> 00:01:03,853
‫quando o novo documento for criado.

21
00:01:04,940 --> 00:01:06,163
‫Portanto, função, e

22
00:01:07,210 --> 00:01:10,320
‫aqui novamente, não podemos usar uma função de seta

23
00:01:10,320 --> 00:01:13,183
‫porque na verdade precisamos usar a palavra-chave disk.

24
00:01:14,690 --> 00:01:15,523
‫OK?

25
00:01:16,560 --> 00:01:19,180
‫Então, lembre-se de que a partir da função

26
00:01:19,180 --> 00:01:21,470
‫validadora retornamos verdadeiro ou falso

27
00:01:21,470 --> 00:01:23,960
‫e se o valor de retorno for

28
00:01:23,960 --> 00:01:27,550
‫falso, isso significa que obteremos um erro de validação, certo?

29
00:01:27,550 --> 00:01:29,630
‫E, claro, se for verdade, então não.

30
00:01:29,630 --> 00:01:33,820
‫E então o que queremos aqui é dizer que o elemento atual so,

31
00:01:33,820 --> 00:01:37,643
‫senha de confirmação, é igual a essa senha de ponto, então, senha

32
00:01:37,643 --> 00:01:40,760
‫de confirmação, é igual a essa senha de ponto,

33
00:01:40,760 --> 00:01:42,350
‫e é isso mesmo!

34
00:01:42,350 --> 00:01:46,510
‫Então, por exemplo, se a confirmação da senha for A-B-C

35
00:01:46,510 --> 00:01:49,520
‫e a senha também for A-B-C, então,

36
00:01:49,520 --> 00:01:52,530
‫é claro, isso retornará verdadeiro, certo?

37
00:01:52,530 --> 00:01:54,330
‫E então a validação

38
00:01:54,330 --> 00:01:56,550
‫é passada e nenhum erro ocorrerá.

39
00:01:56,550 --> 00:02:00,440
‫Mas, se a senha inicial for, digamos, X-Y-Z, bem, então

40
00:02:00,440 --> 00:02:02,860
‫é claro que isso retornará

41
00:02:02,860 --> 00:02:05,820
‫falso e teremos um erro de validação, certo?

42
00:02:05,820 --> 00:02:08,660
‫Então, muito simples, mas precisamos ter

43
00:02:08,660 --> 00:02:12,320
‫em mente que isso só vai funcionar ao salvar, ok?

44
00:02:12,320 --> 00:02:13,950
‫Falei sobre isso antes,

45
00:02:13,950 --> 00:02:17,840
‫quando usamos o validador personalizado no modelo de tour, certo?

46
00:02:17,840 --> 00:02:19,740
‫Mas estou lembrando você

47
00:02:19,740 --> 00:02:24,120
‫disso aqui novamente porque isso é absolutamente crucial aqui neste ponto, certo?

48
00:02:24,120 --> 00:02:26,423
‫Então, deixe-me escrever aqui para você.

49
00:02:27,739 --> 00:02:29,010
‫(clique

50
00:02:29,010 --> 00:02:30,410
‫do teclado)

51
00:02:30,410 --> 00:02:32,050
‫Ao salvar.

52
00:02:32,050 --> 00:02:32,883
‫OK?

53
00:02:32,883 --> 00:02:35,740
‫E por isso, sempre que quisermos atualizar um

54
00:02:35,740 --> 00:02:38,250
‫usuário, sempre teremos que usar save também

55
00:02:38,250 --> 00:02:41,010
‫e não, por exemplo, encontrar um e atualizar

56
00:02:41,010 --> 00:02:43,310
‫como fizemos com nossos tours, ok?

57
00:02:43,310 --> 00:02:45,570
‫Portanto, vamos manter isso em mente

58
00:02:45,570 --> 00:02:48,730
‫quando escrevermos o resto do código ao longo do

59
00:02:48,730 --> 00:02:51,670
‫resto da seção e especialmente para atualização, ok?

60
00:02:51,670 --> 00:02:54,400
‫Porque digamos que atualizamos a senha do usuário

61
00:02:54,400 --> 00:02:56,320
‫simplesmente com uma atualização regular.

62
00:02:56,320 --> 00:02:58,910
‫Então nesse caso, essa senha de confirmação

63
00:02:58,910 --> 00:03:01,540
‫de validação que temos aqui não funcionaria mais, ok?

64
00:03:01,540 --> 00:03:04,670
‫E é claro que isso não pode acontecer, ok?

65
00:03:04,670 --> 00:03:08,410
‫E então, novamente, lembre-se de que isso só funcionará

66
00:03:08,410 --> 00:03:12,920
‫quando criarmos um novo objeto, ou seja, criar um ponto ou salvar.

67
00:03:12,920 --> 00:03:13,753
‫OK?

68
00:03:13,753 --> 00:03:15,524
‫Então, ao criar e

69
00:03:15,524 --> 00:03:18,550
‫salvar, Então, ao criar e salvar, tudo

70
00:03:18,550 --> 00:03:19,383
‫bem?

71
00:03:19,383 --> 00:03:22,830
‫Então, criamos um novo objeto usando criar, certo?

72
00:03:22,830 --> 00:03:25,431
‫Então, bem aqui, usei um dot create Então,

73
00:03:25,431 --> 00:03:27,100
‫bem aqui, usei um dot

74
00:03:27,100 --> 00:03:28,463
‫create, mas lembre-se

75
00:03:28,463 --> 00:03:31,143
‫de como também mostrei que podemos usar um ponto

76
00:03:33,100 --> 00:03:35,160
‫de salvamento do usuário, assim, certo?

77
00:03:35,160 --> 00:03:38,470
‫E, de fato, também podemos usar um ponto save

78
00:03:38,470 --> 00:03:41,550
‫do usuário para atualizar o usuário, certo?

79
00:03:41,550 --> 00:03:43,593
‫Mas, novamente, mais sobre isso um pouco mais tarde.

80
00:03:44,820 --> 00:03:45,810
‫OK?

81
00:03:45,810 --> 00:03:50,063
‫Então, vamos tentar essa validação aqui, certo?

82
00:03:51,230 --> 00:03:53,280
‫Então, antes de mais nada, vamos tentar

83
00:03:53,280 --> 00:03:55,210
‫criar um novo usuário com esses

84
00:03:55,210 --> 00:03:57,660
‫dados aqui, o que não deve funcionar porque

85
00:03:57,660 --> 00:04:01,020
‫já temos um usuário com esse endereço de e-mail e dissemos

86
00:04:01,020 --> 00:04:03,290
‫que ele deveria ser único e, portanto,

87
00:04:03,290 --> 00:04:04,590
‫não deveria funcionar.

88
00:04:06,330 --> 00:04:10,276
‫Ok, então é claro nosso erro de chave duplicada, certo?

89
00:04:10,276 --> 00:04:12,210
‫Ok, e então, é claro, nosso erro de chave duplicada, certo?

90
00:04:12,210 --> 00:04:14,170
‫Agora, se você estivesse em

91
00:04:14,170 --> 00:04:17,040
‫produção, é claro que já receberíamos nosso erro de

92
00:04:17,040 --> 00:04:19,620
‫formatação agradável que criamos na última seção, certo?

93
00:04:19,620 --> 00:04:23,730
‫Mas agora estamos em desenvolvimento e esse é o erro que

94
00:04:23,730 --> 00:04:25,383
‫definimos que queremos ver.

95
00:04:26,510 --> 00:04:27,343
‫OK?

96
00:04:28,440 --> 00:04:30,890
‫Portanto, vamos simplesmente usar outro e-mail aqui e,

97
00:04:30,890 --> 00:04:33,060
‫como estamos trabalhando no e-mail aqui,

98
00:04:33,060 --> 00:04:36,593
‫também vamos ver como funciona a validação do endereço de e-mail.

99
00:04:37,650 --> 00:04:40,833
‫Digamos que especificamos isso como nosso e-mail.

100
00:04:42,190 --> 00:04:47,663
‫E assim, vemos o erro ", forneça um e-mail válido. " OK?

101
00:04:48,660 --> 00:04:51,320
‫Então, vamos testar assim porque acho que também

102
00:04:51,320 --> 00:04:53,120
‫não deveria ser válido.

103
00:04:53,120 --> 00:04:55,043
‫Talvez seja, mas vamos ver.

104
00:04:56,170 --> 00:04:57,840
‫E sim, na verdade não

105
00:04:57,840 --> 00:05:01,050
‫é porque não há nomes de domínio com apenas uma letra, certo?

106
00:05:01,050 --> 00:05:03,990
‫E então este validador é muito específico,

107
00:05:03,990 --> 00:05:05,890
‫então é muito bom.

108
00:05:05,890 --> 00:05:09,080
‫Agora, se fizermos assim, é claro que deve funcionar.

109
00:05:09,080 --> 00:05:11,000
‫Mas de qualquer forma, o

110
00:05:11,000 --> 00:05:13,860
‫que queríamos testar aqui são essas senhas diferentes, certo?

111
00:05:13,860 --> 00:05:15,460
‫E eu me lembro agora

112
00:05:15,460 --> 00:05:18,493
‫que na verdade não criamos uma mensagem de erro, eu acredito.

113
00:05:19,430 --> 00:05:21,070
‫E sim, não o fizemos.

114
00:05:21,070 --> 00:05:22,993
‫E então, vamos adicionar isso aqui também.

115
00:05:25,120 --> 00:05:26,113
‫Portanto, mensagem,

116
00:05:28,510 --> 00:05:29,510
‫não são os

117
00:05:30,930 --> 00:05:31,803
‫mesmos.

118
00:05:32,900 --> 00:05:33,733
‫OK.

119
00:05:35,580 --> 00:05:38,390
‫Então, vamos adicionar algo aqui, não importa.

120
00:05:38,390 --> 00:05:42,613
‫E agora, as senhas não são as mesmas, ok?

121
00:05:43,460 --> 00:05:45,233
‫Tão perfeito.

122
00:05:45,233 --> 00:05:48,333
‫E agora, é claro, nossa validação deve ser aprovada.

123
00:05:49,640 --> 00:05:53,690
‫E, de fato, é e criamos nosso novo usuário.

124
00:05:53,690 --> 00:05:55,900
‫Vamos ao Compass aqui, dar

125
00:05:55,900 --> 00:05:58,640
‫uma olhada e, em seguida, excluí-lo para

126
00:05:58,640 --> 00:06:02,953
‫que eu possa criar mais usuários com o mesmo e-mail posteriormente.

127
00:06:04,330 --> 00:06:05,163
‫Tudo bem?

128
00:06:05,163 --> 00:06:07,310
‫E não queremos todo esse lixo aqui

129
00:06:07,310 --> 00:06:09,990
‫de qualquer maneira, então, todos esses usuários de teste, ok?

130
00:06:09,990 --> 00:06:13,330
‫Mas agora, a próxima etapa é criptografar realmente essas

131
00:06:13,330 --> 00:06:15,560
‫senhas simples que estamos armazenando em

132
00:06:15,560 --> 00:06:17,570
‫nosso banco de dados agora.

133
00:06:17,570 --> 00:06:19,940
‫Então, como mencionei no último vídeo,

134
00:06:19,940 --> 00:06:21,950
‫quando estamos trabalhando com

135
00:06:21,950 --> 00:06:24,220
‫autenticação, um dos princípios mais

136
00:06:24,220 --> 00:06:29,090
‫fundamentais é nunca armazenar senhas simples em um banco de dados, ok?

137
00:06:29,090 --> 00:06:33,170
‫Então isso é algo absolutamente inaceitável, certo?

138
00:06:33,170 --> 00:06:36,650
‫Portanto, devemos sempre criptografar as senhas dos usuários, porque imagine

139
00:06:36,650 --> 00:06:38,510
‫que, por algum motivo,

140
00:06:38,510 --> 00:06:41,250
‫um hacker tenha acesso ao banco de dados.

141
00:06:41,250 --> 00:06:44,880
‫Se as senhas estiverem armazenadas em texto simples lá, ele poderá

142
00:06:44,880 --> 00:06:47,550
‫simplesmente fazer o login como qualquer usuário

143
00:06:47,550 --> 00:06:49,720
‫e fazer o que realmente

144
00:06:49,720 --> 00:06:52,730
‫quiser e causar muitos danos em alguns casos, certo?

145
00:06:52,730 --> 00:06:55,770
‫E, portanto, precisamos evitar isso de maneira absoluta.

146
00:06:55,770 --> 00:06:58,563
‫E então vamos agora implementar isso.

147
00:06:59,870 --> 00:07:03,610
‫Agora, onde é o melhor lugar para realmente fazer isso?

148
00:07:03,610 --> 00:07:07,270
‫Bem, eu diria que o modelo é sempre o melhor

149
00:07:07,270 --> 00:07:10,160
‫lugar para fazer esse tipo de funcionalidade.

150
00:07:10,160 --> 00:07:12,110
‫Então, nesse caso, a criptografia porque

151
00:07:12,110 --> 00:07:14,960
‫realmente tem a ver com os dados em si

152
00:07:14,960 --> 00:07:16,730
‫e então deve estar

153
00:07:16,730 --> 00:07:19,070
‫no modelo e não no controlador, ok?

154
00:07:19,070 --> 00:07:22,022
‫Portanto, novamente, mantenha os modelos gordos e a filosofia

155
00:07:22,022 --> 00:07:24,040
‫dos controladores finos em mente aqui.

156
00:07:24,040 --> 00:07:24,873
‫Tudo bem?

157
00:07:27,260 --> 00:07:31,170
‫Então, como vamos implementar essa criptografia?

158
00:07:31,170 --> 00:07:33,660
‫Bem, este é outro caso de uso

159
00:07:33,660 --> 00:07:36,050
‫perfeito para usar o middleware Mongoose.

160
00:07:36,050 --> 00:07:37,430
‫E o que

161
00:07:37,430 --> 00:07:39,210
‫vamos usar é um middleware pré-salvo.

162
00:07:39,210 --> 00:07:42,630
‫Então, basicamente, documente o middleware, certo?

163
00:07:42,630 --> 00:07:47,630
‫Portanto, lembre-se de que definimos isso no esquema, certo?

164
00:07:47,760 --> 00:07:50,130
‫E neste caso, queremos definir um

165
00:07:50,130 --> 00:07:52,928
‫pré-gancho, ou seja, um pré-middleware ao salvar, certo?

166
00:07:52,928 --> 00:07:54,490
‫então, um pré-middleware ao salvar, certo?

167
00:07:54,490 --> 00:07:56,750
‫E a razão de estarmos fazendo

168
00:07:56,750 --> 00:07:58,320
‫assim é que a

169
00:07:58,320 --> 00:08:01,240
‫função de middleware que vamos especificar aqui, então a

170
00:08:01,240 --> 00:08:03,660
‫criptografia, acontecerá entre o momento em que recebemos

171
00:08:03,660 --> 00:08:05,990
‫os dados e o momento em que

172
00:08:05,990 --> 00:08:09,340
‫eles realmente são persistidos para o banco de dados, ok?

173
00:08:09,340 --> 00:08:12,200
‫Então é aí que o middleware pré-salvo é executado.

174
00:08:12,200 --> 00:08:15,600
‫Entre obter os dados e salvá-los no banco de dados.

175
00:08:15,600 --> 00:08:19,210
‫E esse é o momento perfeito para manipular os dados.

176
00:08:19,210 --> 00:08:20,420
‫Tudo bem?

177
00:08:20,420 --> 00:08:21,253
‫Então,

178
00:08:22,480 --> 00:08:26,010
‫uma função, e lembre-se de que temos acesso

179
00:08:26,010 --> 00:08:29,740
‫à próxima função para chamar o próximo middleware.

180
00:08:29,740 --> 00:08:33,220
‫Ok, agora só queremos criptografar a senha

181
00:08:33,220 --> 00:08:37,400
‫se o campo de senha tiver sido atualizado, certo?

182
00:08:37,400 --> 00:08:40,900
‫Então, basicamente, apenas quando a senha é realmente alterada ou

183
00:08:40,900 --> 00:08:43,370
‫também quando é criada uma nova, certo?

184
00:08:43,370 --> 00:08:46,890
‫Pois imagine que o usuário está apenas atualizando o e-mail.

185
00:08:46,890 --> 00:08:48,340
‫Então, nesse caso,

186
00:08:48,340 --> 00:08:51,760
‫é claro, não queremos criptografar a senha de novo, certo?

187
00:08:51,760 --> 00:08:54,420
‫E podemos fazer isso com o Mongoose.

188
00:08:54,420 --> 00:08:58,130
‫E então vamos dizer, se e então isso, que

189
00:08:58,130 --> 00:09:00,840
‫se refere ao documento atual, certo?

190
00:09:00,840 --> 00:09:03,070
‫E assim, neste caso, para o usuário atual

191
00:09:03,070 --> 00:09:04,583
‫e, em seguida, é modificado.

192
00:09:06,690 --> 00:09:07,523
‫OK?

193
00:09:07,523 --> 00:09:10,670
‫Portanto, temos um método em todos os documentos que podemos

194
00:09:10,670 --> 00:09:13,260
‫usar se um determinado campo for modificado.

195
00:09:13,260 --> 00:09:16,270
‫E então aqui, precisamos passar o nome do campo,

196
00:09:16,270 --> 00:09:18,773
‫então "senha. " OK?

197
00:09:18,773 --> 00:09:21,080
‫E então, basicamente, o que queremos

198
00:09:21,080 --> 00:09:24,440
‫fazer aqui é dizer que se a senha não foi

199
00:09:24,440 --> 00:09:27,540
‫modificada, então não, então, nesse caso, vamos simplesmente retornar

200
00:09:27,540 --> 00:09:30,520
‫desta função e não executar nenhum outro código

201
00:09:30,520 --> 00:09:32,320
‫que está aqui e então

202
00:09:33,160 --> 00:09:34,863
‫chamar o próximo middleware.

203
00:09:35,834 --> 00:09:36,667
‫OK?

204
00:09:37,930 --> 00:09:41,170
‫Então, novamente, se a senha não foi modificada, vamos

205
00:09:41,170 --> 00:09:42,810
‫apenas sair desta função

206
00:09:42,810 --> 00:09:44,600
‫e chamar o próximo middleware.

207
00:09:44,600 --> 00:09:46,770
‫Caso contrário, executaremos o código

208
00:09:46,770 --> 00:09:48,580
‫que irei inserir aqui.

209
00:09:48,580 --> 00:09:51,270
‫E agora é finalmente a hora de

210
00:09:51,270 --> 00:09:55,200
‫realmente criptografar, ou como também podemos dizer, de hash a senha, certo?

211
00:09:55,200 --> 00:09:58,490
‫Portanto, você verá o termo "hash" ou "hashing"

212
00:09:58,490 --> 00:10:01,890
‫o tempo todo e isso basicamente significa criptografia também, certo?

213
00:10:01,890 --> 00:10:05,440
‫Agora vamos fazer essa criptografia, ou hash,

214
00:10:05,440 --> 00:10:08,580
‫usando um algoritmo de hash

215
00:10:08,580 --> 00:10:13,230
‫muito conhecido, bem estudado e muito popular chamado bcrypt.

216
00:10:13,230 --> 00:10:14,290
‫OK?

217
00:10:14,290 --> 00:10:18,200
‫Portanto, este algoritmo primeiro salta e depois hash nossa senha

218
00:10:18,200 --> 00:10:21,130
‫para torná-la realmente forte e protegê-la contra

219
00:10:21,130 --> 00:10:23,760
‫ataques de força bruta, certo?

220
00:10:23,760 --> 00:10:25,280
‫E essa é a razão

221
00:10:25,280 --> 00:10:27,600
‫pela qual a criptografia precisa ser realmente forte.

222
00:10:27,600 --> 00:10:30,360
‫Porque os ataques de força bruta podem

223
00:10:30,360 --> 00:10:34,040
‫tentar adivinhar certas senhas se não houver uma criptografia forte.

224
00:10:34,040 --> 00:10:37,990
‫E lembre-se de como eu disse que bcrypt salgará nossa

225
00:10:37,990 --> 00:10:40,950
‫senha e isso significa apenas que adicionará uma

226
00:10:40,950 --> 00:10:44,500
‫string aleatória à senha para que duas senhas iguais

227
00:10:44,500 --> 00:10:47,430
‫não gerem o mesmo hash, ok?

228
00:10:47,430 --> 00:10:48,490
‫Faz sentido?

229
00:10:48,490 --> 00:10:51,520
‫Não vou entrar em todos os detalhes criptográficos de como

230
00:10:51,520 --> 00:10:53,940
‫isso realmente funciona nos bastidores e

231
00:10:53,940 --> 00:10:56,850
‫por que precisamos de um sistema tão complexo, certo?

232
00:10:56,850 --> 00:11:00,140
‫Mas é claro que você pode ler tudo o que quiser sobre o bcrypt online.

233
00:11:00,140 --> 00:11:02,830
‫Há realmente uma tonelada de coisas

234
00:11:02,830 --> 00:11:05,290
‫interessantes para descobrir lá, certo?

235
00:11:05,290 --> 00:11:09,270
‫De qualquer forma, vamos agora usar o pacote bcrypt

236
00:11:09,270 --> 00:11:12,133
‫js para usar este algoritmo.

237
00:11:13,790 --> 00:11:14,623
‫Então, npm

238
00:11:15,560 --> 00:11:16,393
‫install,

239
00:11:16,393 --> 00:11:17,660
‫então npm install

240
00:11:19,156 --> 00:11:21,655
‫bcryptjs.

241
00:11:21,655 --> 00:11:22,488
‫OK?

242
00:11:22,488 --> 00:11:25,410
‫E então esta é basicamente uma implementação

243
00:11:25,410 --> 00:11:26,713
‫bcrypt para Javascript.

244
00:11:27,650 --> 00:11:28,750
‫OK?

245
00:11:28,750 --> 00:11:30,720
‫Vamos voltar ao nosso terminal principal e,

246
00:11:32,550 --> 00:11:34,513
‫em seguida, prosseguir e importá-lo aqui.

247
00:11:36,092 --> 00:11:40,820
‫E este é por padrão chamado apenas bcrypt, ok?

248
00:11:40,820 --> 00:11:41,873
‫E não bcryptjs.

249
00:11:42,889 --> 00:11:45,889
‫(clique do teclado) Tudo

250
00:11:49,330 --> 00:11:50,163
‫bem.

251
00:11:53,360 --> 00:11:54,193
‫Tudo bem.

252
00:11:54,193 --> 00:11:56,033
‫E agora, vamos realmente usá-lo.

253
00:11:56,970 --> 00:12:00,293
‫Então, queremos dizer que esta senha de ponto, então

254
00:12:01,370 --> 00:12:03,510
‫a senha atual neste documento deve

255
00:12:04,590 --> 00:12:07,381
‫ser igual a bcrypt ponto hash deve

256
00:12:07,381 --> 00:12:10,214
‫ser igual a bcrypt ponto hash e então

257
00:12:11,600 --> 00:12:13,100
‫nossa senha atual.

258
00:12:14,640 --> 00:12:15,473
‫OK?

259
00:12:15,473 --> 00:12:19,600
‫E então aqui precisamos especificar um parâmetro de custo, ok?

260
00:12:19,600 --> 00:12:22,100
‫E podemos realmente fazer isso de duas maneiras.

261
00:12:22,100 --> 00:12:25,700
‫Então a primeira maneira será gerar manualmente o salt, de

262
00:12:25,700 --> 00:12:27,740
‫forma que aquela string aleatória basicamente,

263
00:12:27,740 --> 00:12:29,727
‫que será adicionada à

264
00:12:29,727 --> 00:12:33,770
‫nossa senha e então usar esse salt aqui nesta função hash.

265
00:12:33,770 --> 00:12:34,603
‫Tudo bem?

266
00:12:34,603 --> 00:12:36,480
‫Mas, em vez disso, para facilitar

267
00:12:36,480 --> 00:12:39,260
‫um pouco, também podemos simplesmente passar um parâmetro de custo

268
00:12:39,260 --> 00:12:40,620
‫para essa função aqui.

269
00:12:40,620 --> 00:12:42,920
‫E isso é basicamente uma

270
00:12:42,920 --> 00:12:47,360
‫medida de quão intensiva será a operação da CPU, certo?

271
00:12:47,360 --> 00:12:50,230
‫Acredito que o valor padrão aqui seja 10,

272
00:12:50,230 --> 00:12:53,130
‫mas agora é um pouco melhor usar 12 porque

273
00:12:53,130 --> 00:12:55,810
‫os computadores estão cada vez mais poderosos.

274
00:12:55,810 --> 00:12:58,800
‫Então, como há 20 anos, você poderia ter usado

275
00:12:58,800 --> 00:13:01,170
‫oito aqui e um pouco depois

276
00:13:01,170 --> 00:13:04,670
‫de 10, mas agora, neste momento, é melhor usar 12.

277
00:13:04,670 --> 00:13:06,610
‫E quanto maior for o

278
00:13:06,610 --> 00:13:09,610
‫custo aqui, basicamente quanto mais intensivo de CPU

279
00:13:09,610 --> 00:13:13,350
‫o processo terá e melhor será a criptografia da senha, certo?

280
00:13:13,350 --> 00:13:15,070
‫E claro que poderíamos ir

281
00:13:15,070 --> 00:13:17,750
‫ainda mais alto, mas então demoraria muito, certo?

282
00:13:17,750 --> 00:13:20,330
‫E vou mostrar isso a você em um segundo.

283
00:13:20,330 --> 00:13:21,163
‫OK?

284
00:13:21,163 --> 00:13:22,910
‫Mas, por enquanto, vamos

285
00:13:22,910 --> 00:13:26,060
‫realmente terminar isso porque ainda há uma coisa aqui.

286
00:13:26,060 --> 00:13:29,040
‫Portanto, este hash aqui é na verdade a versão

287
00:13:29,040 --> 00:13:31,440
‫assíncrona, mas também existe uma versão síncrona.

288
00:13:31,440 --> 00:13:33,960
‫Mas, como você já sabe, não queremos

289
00:13:33,960 --> 00:13:35,313
‫usar a versão

290
00:13:35,313 --> 00:13:38,810
‫síncrona porque isso bloqueará o loop de eventos e evitará

291
00:13:38,810 --> 00:13:41,000
‫que outros usuários usem o aplicativo.

292
00:13:41,000 --> 00:13:43,350
‫Assim como aprendemos no início.

293
00:13:43,350 --> 00:13:45,230
‫E é claro que

294
00:13:45,230 --> 00:13:48,130
‫queremos usar a versão assíncrona que é esta.

295
00:13:48,130 --> 00:13:50,210
‫E isso então retornará

296
00:13:50,210 --> 00:13:53,860
‫uma promessa e essa promessa, é claro, precisamos aguardar.

297
00:13:53,860 --> 00:13:58,860
‫E então, precisamos usar await e dizer que essa função

298
00:13:58,960 --> 00:14:02,513
‫é uma função assíncrona, exatamente como esta.

299
00:14:04,730 --> 00:14:06,860
‫Então, vamos recapitular isso aqui.

300
00:14:06,860 --> 00:14:09,780
‫Então, queremos definir nossa senha atual basicamente

301
00:14:09,780 --> 00:14:14,780
‫para criptografar esta versão da senha original com um custo de 12,

302
00:14:14,780 --> 00:14:17,500
‫não para tornar muito fácil

303
00:14:17,500 --> 00:14:21,690
‫quebrar a senha, mas também para não fazer o aplicativo

304
00:14:21,690 --> 00:14:25,423
‫demorar muito para criptografar a senha, tudo bem?

305
00:14:25,423 --> 00:14:27,920
‫Com isso, criptografamos nossa senha e

306
00:14:27,920 --> 00:14:30,070
‫agora no final, o que

307
00:14:30,070 --> 00:14:33,840
‫precisamos fazer é basicamente deletar a senha de confirmação, certo?

308
00:14:33,840 --> 00:14:35,670
‫Porque, neste momento,

309
00:14:35,670 --> 00:14:38,663
‫só temos a senha real hash, certo?

310
00:14:40,560 --> 00:14:42,489
‫Então, essa senha de ponto

311
00:14:42,489 --> 00:14:43,643
‫confirma, Então,

312
00:14:43,643 --> 00:14:45,980
‫essa senha de ponto confirma, e como

313
00:14:45,980 --> 00:14:48,740
‫basicamente excluímos o campo, para não ser persistido

314
00:14:48,740 --> 00:14:51,440
‫no banco de dados é defini-lo como indefinido.

315
00:14:51,440 --> 00:14:52,400
‫Tudo bem?

316
00:14:52,400 --> 00:14:55,970
‫Então, nós realmente só precisamos confirmar essa senha aqui

317
00:14:55,970 --> 00:14:58,950
‫para a validação que implementamos antes.

318
00:14:58,950 --> 00:15:00,730
‫Então, apenas para ter certeza

319
00:15:00,730 --> 00:15:03,160
‫de que o usuário realmente inseriu duas senhas

320
00:15:03,160 --> 00:15:06,660
‫iguais para que ele não cometa nenhum erro com sua senha.

321
00:15:06,660 --> 00:15:07,590
‫Direito?

322
00:15:07,590 --> 00:15:10,300
‫E assim, depois que essa validação

323
00:15:10,300 --> 00:15:13,060
‫foi bem-sucedida, não precisamos mais desse campo,

324
00:15:13,060 --> 00:15:16,710
‫então realmente não queremos persisti-lo no banco de dados.

325
00:15:16,710 --> 00:15:20,130
‫E é por isso que simplesmente definimos aqui como indefinido.

326
00:15:20,130 --> 00:15:21,150
‫Tudo bem?

327
00:15:21,150 --> 00:15:23,220
‫Agora você deve estar se perguntando por

328
00:15:23,220 --> 00:15:25,920
‫que isso funciona, porque na verdade definimos a confirmação

329
00:15:25,920 --> 00:15:27,800
‫da senha como obrigatória, certo?

330
00:15:27,800 --> 00:15:30,750
‫Mas isso significa simplesmente que é uma entrada

331
00:15:30,750 --> 00:15:33,650
‫obrigatória, não que seja realmente persistido no banco

332
00:15:33,650 --> 00:15:35,149
‫de dados, certo?

333
00:15:35,149 --> 00:15:36,982
‫para o banco de dados, ok?

334
00:15:38,393 --> 00:15:42,390
‫Agora, só para terminar, é claro que também precisamos ligar em seguida.

335
00:15:42,390 --> 00:15:43,240
‫OK?

336
00:15:43,240 --> 00:15:44,290
‫Vamos dar uma chance.

337
00:15:45,640 --> 00:15:47,440
‫E, na verdade, vou adicionar alguns

338
00:15:47,440 --> 00:15:49,370
‫comentários aqui para deixar bem claro para você.

339
00:15:49,370 --> 00:15:52,400
‫Basicamente, o que isso faz é executar essa

340
00:15:54,180 --> 00:15:55,050
‫função

341
00:15:56,160 --> 00:15:57,190
‫apenas se a

342
00:15:58,930 --> 00:16:00,533
‫senha tiver sido realmente modificada.

343
00:16:05,070 --> 00:16:05,903
‫Então

344
00:16:08,840 --> 00:16:11,803
‫aqui, hash a senha com custo de 12.

345
00:16:14,785 --> 00:16:16,300
‫Em seguida,

346
00:16:16,300 --> 00:16:19,443
‫exclua o campo de confirmação de senha.

347
00:16:20,750 --> 00:16:21,583
‫OK.

348
00:16:21,583 --> 00:16:24,453
‫E agora, vamos testar isso.

349
00:16:25,660 --> 00:16:29,590
‫E agora vou criar um novo usuário exatamente com esses dados

350
00:16:29,590 --> 00:16:32,470
‫e vamos agora dar uma olhada no resultado.

351
00:16:32,470 --> 00:16:36,460
‫E, de fato, agora temos essa senha de aparência muito estranha

352
00:16:36,460 --> 00:16:40,163
‫que, de fato, é a versão criptografada de pass1234.

353
00:16:41,410 --> 00:16:45,580
‫E também, como você pode ver, a confirmação da senha não está mais aqui.

354
00:16:45,580 --> 00:16:46,413
‫OK?

355
00:16:46,413 --> 00:16:48,930
‫E assim, agora armazenamos os usuários de forma

356
00:16:48,930 --> 00:16:51,353
‫segura em nosso banco de dados.

357
00:16:52,280 --> 00:16:55,310
‫Deixe-me mostrar como funcionará se, por

358
00:16:55,310 --> 00:16:58,233
‫exemplo, definirmos como 16 aqui.

359
00:17:00,740 --> 00:17:02,540
‫E preciso mudar o e-mail aqui.

360
00:17:03,540 --> 00:17:07,120
‫E isso agora deve levar muito tempo e não

361
00:17:07,120 --> 00:17:09,180
‫tenho certeza se posso esperar.

362
00:17:09,180 --> 00:17:12,490
‫Oh, na verdade, demorou cerca de quatro segundos e meio.

363
00:17:12,490 --> 00:17:17,320
‫Mas isso ainda é um pouco demais, eu acredito, ok?

364
00:17:17,320 --> 00:17:18,980
‫Então, vamos definir de

365
00:17:18,980 --> 00:17:20,330
‫volta para

366
00:17:21,410 --> 00:17:24,507
‫12 e assim deve ser melhor, ok?

367
00:17:24,507 --> 00:17:26,670
‫E agora vamos, novamente, excluir

368
00:17:26,670 --> 00:17:29,630
‫esses usuários aqui que acabamos de criar.

369
00:17:29,630 --> 00:17:32,110
‫E na verdade eu preciso me livrar

370
00:17:32,110 --> 00:17:36,000
‫deste primeiro porque este ainda tem a senha em texto simples.

371
00:17:36,000 --> 00:17:38,090
‫E, portanto, esse usuário não funcionará

372
00:17:38,090 --> 00:17:40,370
‫quando começarmos a realmente fazer o login

373
00:17:40,370 --> 00:17:42,621
‫de usuários com base em suas senhas.

374
00:17:42,621 --> 00:17:44,250
‫OK?

375
00:17:44,250 --> 00:17:45,743
‫Então, vamos nos livrar disso.

376
00:17:52,780 --> 00:17:54,060
‫OK?

377
00:17:54,060 --> 00:17:56,170
‫E também o que eu queria

378
00:17:57,510 --> 00:17:59,880
‫mostrar aqui é que colocamos exatamente a mesma

379
00:17:59,880 --> 00:18:02,390
‫senha para esses dois usuários que criamos, certo?

380
00:18:02,390 --> 00:18:04,520
‫Mas você vê que a

381
00:18:04,520 --> 00:18:07,630
‫senha criptografada é na verdade muito diferente, certo?

382
00:18:07,630 --> 00:18:09,820
‫E esse é o poder de criar sal na senha

383
00:18:09,820 --> 00:18:11,043
‫antes de fazer o hash.

384
00:18:12,220 --> 00:18:13,060
‫Tudo bem?

385
00:18:13,060 --> 00:18:17,250
‫Assim, de novo, implementamos um gerenciamento de senha muito

386
00:18:17,250 --> 00:18:19,313
‫seguro e bom.

