‫-: Então, nos últimos vídeos,
‫permitimos que um usuário redefinisse sua senha e,
‫em seguida, criasse uma
‫nova, mas agora
‫também queremos permitir que um usuário logado simplesmente atualize
‫sua senha sem ter que esquecê-la,
‫e assim sem todo aquele processo de reinicialização.
‫Então, vamos construir isso agora.
‫E, assim como
‫antes, vamos fazer isso em nosso controlador de autenticação.
‫Portanto, exporte. Atualizar senha.
‫Tudo bem, e assim, como sempre,
‫nossos três parâmetros de Middleware aqui, e tudo bem.
‫Agora lembre-se que esta funcionalidade de atualização de senha
‫é apenas para usuários logados,
‫mas ainda precisamos que o usuário passe sua senha atual,
‫para confirmar se
‫o usuário realmente é quem diz ser.
‫Portanto, apenas como medida de segurança,
‫pois imagine que alguém encontraria seu computador aberto e, em seguida,
‫seria capaz de alterar as senhas dos sites que
‫você abriu atualmente
‫sem ser solicitado a inserir uma senha novamente.
‫E isso basicamente desconectaria você
‫de todos os seus aplicativos existentes, o
‫que, é claro, seria uma experiência terrível.
‫E por isso, como medida de segurança,
‫sempre precisamos pedir a senha atual antes de atualizá-la, tudo bem.
‫E, com isso em mente, vamos definir
‫todas as etapas que
‫precisamos seguir para implementar essa funcionalidade como antes.
‫Então, primeiro, precisamos tirar o usuário
‫da coleção, basicamente.
‫Em segundo lugar, precisamos verificar
‫se a senha postada está correta.
‫Direito.
‫Em terceiro lugar, se a senha estiver
‫correta, atualize a senha.
‫E, finalmente, precisamos fazer o login do usuário
‫novamente, basicamente para enviar o jsonwebtoken de volta ao usuário, agora
‫conectado com a nova senha que acabou de ser atualizada.
‫Ok, e isso é muito parecido com o
‫que já fizemos
‫antes, então estou deixando este
‫para você como um desafio, ok?
‫Então, por favor, tente ir em frente e implementar isso por conta
‫própria e, se precisar, você pode, é claro, dar
‫uma olhada no código
‫que escrevemos antes, mas realmente tente escrever o código
‫por conta própria, sem copiar muito, ok ?
‫Portanto, você pode dar uma olhada no resto
‫do código para ver como funciona, mas não o copie realmente, certo?
‫Porque então você realmente não vai aprender, certo.
‫Então, pause o vídeo aqui, e eu te vejo em
‫um segundo com minha solução.
‫Ok, então espero que você tenha conseguido implementar
‫isso e fazer funcionar, é assim que eu fiz.
‫Então, como sempre, criamos uma nova variável de usuário, e nela
‫aguardamos o resultado de fazer User. findById, e agora
‫de onde esse ID realmente vem?
‫Bem, lembre-se novamente que esta senha de atualização é
‫apenas para autenticados, portanto, para usuários logados, portanto,
‫neste ponto, já teremos o usuário atual
‫em nosso objeto de solicitação.
‫Ok, então isso está vindo do Middleware protegido.
‫Então, req. do utilizador. id e
‫lembre-se de que precisamos pedir explicitamente a senha, certo?
‫Porque, por padrão, não é incluído na saída.
‫Então, nós definimos isso no esquema, lembra?
‫E, na verdade precisamos dessa
‫senha porque agora queremos compará-la com aquela que
‫está armazenada no banco de
‫dados e, para
‫isso, como antes, usaremos este objeto de instância que
‫temos em algum lugar aqui.
‫Sim, corrija a senha, que está disponível em
‫todos os documentos do
‫usuário, por isso leva primeiro a senha
‫do candidato e, em seguida, a senha do usuário real, tudo bem.
‫Ah, e agora ele
‫está me apresentando este erro porque, é claro, eu ainda
‫não declarei isso como uma função assíncrona.
‫Então, assíncrono, e antes de
‫esquecermos, vamos envolvê-lo na função catchAsync aqui também.
‫De qualquer forma, como
‫antes, basicamente queremos criar um erro aqui
‫se a senha atual não estiver correta, então,
‫vamos escrever isso em código.
‫Então, se não for usuário. correctPassword, e
‫então a senha candidata
‫lembre-se, e então essa ficará
‫em um corpo, em uma propriedade que chamaremos de passwordConfirm.
‫Ok, e então como um segundo argumento a senha real, então
‫é um usuário. senha.
‫E então, lembre-se de que esta é uma função
‫assíncrona e, portanto, também precisamos aguardá-la aqui.
‫Bom, então caso a senha não esteja correta,
‫como sempre, criamos um novo erro aqui.
‫Então, novo AppError, e desta vez estamos
‫dizendo que sua senha atual está errada e
‫o código de status 401 para não autorizado.
‫Certo, ótimo.
‫Agora, se chegarmos a este ponto
‫no código, então, basicamente, se a senha também estiver
‫correta, então podemos realmente atualizar a senha,
‫e como fazemos isso?
‫Bem, muito simples, já fizemos isso antes.
‫Tudo o que dizemos é usuário. a senha é igual a req. corpo. senha e, em
‫seguida, o mesmo, é claro, para a confirmação da senha.
‫Ok, e a validação será feita automaticamente pelo
‫validador que especificamos no esquema, e isso será feito
‫assim que realmente salvá-lo.
‫Portanto, aguardamos o usuário. salvar, e dessa
‫vez não desligamos a validação porque,
‫claro, queremos que a validação aconteça, então,
‫como eu disse antes, queremos verificar
‫se a senha de confirmação é
‫realmente igual à senha, certo?
‫Boa.
‫E, agora, apenas para ter certeza de que você entendeu por que
‫não fizemos algo como o usuário. findByIdAndUpdate.
‫Então, por que não fizemos assim?
‫E, eu sei que já falei sobre isso muitas vezes
‫antes, mas quero que você entenda cem por cento
‫por que não podemos usar esta atualização, e
‫é por duas
‫razões, então deixe-me voltar ao nosso modelo.
‫Então, a primeira
‫é que essa validação aqui não vai funcionar, ok?
‫E isso é basicamente porque isso. a senha não
‫é definida quando atualizamos, então quando usamos find by ID e update,
‫porque internamente, nos bastidores, o
‫Mongoose realmente não mantém o objeto atual na memória
‫e, portanto, isso aqui não vai funcionar.
‫E, como eu disse, já falei
‫sobre isso antes, então está escrito aqui também, ok?
‫Mas é muito importante ter em mente
‫que não devemos usar update para nada relacionado a senhas, certo?
‫Então, este não
‫vai funcionar, e também, esses
‫dois Middlewares pré-salvos também não vão funcionar.
‫Então, se usássemos simplesmente update para atualizar
‫a senha, então essa senha não seria
‫criptografada, que é
‫esse primeiro Middleware, e depois também,
‫o timestamp passwordChangedAt também não seria definido, ok?
‫Então, nada disso
‫funcionaria e, novamente, realmente precisamos fazer assim.
‫Vamos apenas colocar isso aqui novamente.
‫E agora, (resmunga), conectamos o usuário e
‫enviamos o token de volta para o cliente.
‫Agora, essa seria na verdade a quarta
‫vez que fizemos o mesmo código,
‫então basicamente esse trecho de
‫código, e então, agora refatoramos muito rapidamente
‫em sua própria função.
‫Agora, esse código na verdade não é o mesmo em todos os lugares.
‫Então, aqui enviamos o código de status
‫400, e não enviamos
‫o usuário, mas aqui no gerenciador de inscrição, na verdade temos
‫um código de status diferente e
‫também enviamos o usuário para o cliente, certo?
‫E então, vamos fazer nossa função realmente manter isso em mente.
‫Então, vamos criar uma função aqui, criar e enviar token,
‫e então os argumentos de que
‫precisamos aqui são o usuário, porque é
‫onde o ID está armazenado.
‫Então, também queremos o
‫código de status e, é claro, precisamos ter acesso ao
‫objeto de resposta para poder enviar uma
‫resposta de volta ao cliente, certo?
‫E então, basicamente agora o que precisamos é desse código.
‫Então, vamos copiá-lo, colocá-lo aqui
‫e, em seguida, substituir as variáveis irrelevantes.
‫Então, o usuário é simplesmente chamado de usuário, então
‫assim, e aqui, o mesmo.
‫Então, não
‫é um novo usuário, e aqui nós substituímos isso pelo
‫código de status, então aquele que está entrando em nossa
‫função, e acho que é realmente isso.
‫Então, vamos agora substituí-lo, então createSendToken, e
‫aqui o usuário é chamado de newUser, o código de status é
‫201 e, em
‫seguida, é claro, o objeto de resposta.
‫Ok, agora podemos nos livrar deste código e
‫vamos apenas copiá-lo.
‫Certo, no log-in, é claro, também enviamos um token, mas desta
‫vez o usuário é realmente chamado de usuário e o código
‫de status é 200.
‫E agora, vamos copiar este.
‫Então, o próximo deve estar aqui, e redefinir a senha,
‫e aqui é
‫realmente o mesmo, então o nome é usuário
‫e código 200, e agora, finalmente, aqui também é o mesmo.
‫E assim, isso conclui nossa função de atualização de senha.
‫Agora, para fazer isso funcionar,
‫é claro que precisamos implementar a rota aqui também em nosso
‫roteador de usuário.
‫Então, roteador. patch, e faremos um patch
‫porque na verdade estamos mudando, então estamos manipulando o
‫documento do usuário e é para isso que serve o patch.
‫E a rota é chamada updateMyPassword.
‫Então, minha senha,
‫porque é para o usuário conectado no momento, e lembre-se,
‫novamente, isso só funciona para usuários
‫logados e, portanto, precisamos usar authController. proteger, que também colocará o
‫objeto de usuário
‫em um objeto de solicitação, certo?
‫Então, proteja e então authController atualize a
‫senha que acabamos de criar.
‫E então, vamos prosseguir e testar isso, ok?
‫Então, vamos copiar essa rota aqui, então
‫UpdateMyPassword, e agora o
‫que precisamos enviar no corpo são essas três senhas
‫na verdade, então é
‫basicamente a passwordCurrent, e por enquanto estou deixando-as vazias,
‫eu simplesmente quero
‫colocar o campo nomes aqui por enquanto.
‫Então, passwordCurrent, então apenas password, que é basicamente
‫a nova,
‫e então, é claro, passwordConfirm.
‫Ok, e agora precisamos realmente fazer o login como
‫um usuário, porque lembre-se, isso só funciona
‫se o usuário já estiver conectado, tudo bem.
‫E então, vamos realmente fazer isso com o administrador aqui.
‫E aqui está, ainda deve ser a senha atual
‫e, de fato, agora estamos logados.
‫E lembre-se de que esse token agora
‫é armazenado na variável de
‫ambiente JWT e, portanto, aqui, para
‫autenticar, vamos usá-lo exatamente como fizemos antes.
‫Portanto, nesta guia de autorização, selecionamos Bearer Token e,
‫em seguida, ele pré-preencherá automaticamente
‫essa variável JWT.
‫Certo, então é daí que
‫realmente virá o ID do usuário, lembra?
‫De qualquer forma, vamos agora especificar a senha atual, então pass1234, e
‫então vamos dizer nova senha, ok?
‫Copie e cole
‫aqui, mas, na verdade, quero começar
‫testando com uma confirmação de senha errada,
‫só para ver se nossa validação ainda
‫está funcionando, e agora a rota não está
‫definida, mas isso é simplesmente porque estamos usando o verbo errado aqui.
‫Claro, ele precisa ser patch.
‫Vamos tentar de novo,
‫mas agora descobrimos que sua senha atual está errada,
‫mas na verdade não está, então está correta.
‫Então, algo deve estar errado com nosso código, então vamos
‫tentar dar uma olhada aqui.
‫E sim, então aqui
‫está o problema porque não queremos comparar ou confirmar a senha,
‫é claro, mas com a senha atual.
‫Ok, então isso é apenas um bug estúpido, certo, e
‫agora deve estar funcionando.
‫Então, é claro, queremos comparar a senha atual
‫com a que
‫está atualmente armazenada no banco de dados.
‫Então, vamos tentar
‫de novo, e esse é o erro de validação
‫que estávamos procurando, então as senhas
‫não são as mesmas porque, na verdade, não são.
‫E agora, antes de realmente atualizar a senha, vamos
‫dar uma olhada no Compass aqui.
‫Vamos apenas atualizá-lo aqui rapidamente
‫e, agora, esta é a senha.
‫Então, terminando aqui é pW1i, certo?
‫Então, vamos atualizar a
‫senha agora e ver como ficará depois, ok?
‫Então, agora tudo deve estar correto.
‫E, de fato, obtemos nosso sucesso e nosso símbolo, tudo bem.
‫Então, vamos confirmar isso aqui rapidamente, e, de
‫fato, você vê que a senha mudou e
‫também a data e hora atual,
‫ou seja, a hora em que basicamente estou gravando este vídeo.
‫Tudo bem, e agora, como antes, vamos
‫realmente fazer este teste aqui.
‫Então, basicamente armazenando o token como uma variável de ambiente.
‫Então, só para que tudo funcione mesmo aqui no Postman.
‫Ok, vamos salvar isso
‫na verdade, atualizar a senha do usuário atual para torná-la realmente
‫explícita e, sim, acho que é isso.
‫Acho que isso é tudo que precisamos fazer
‫para atualizar a senha de um usuário.
‫Em seguida, implementaremos a atualização dos dados de outros
‫usuários, como e-mail ou senhas.