‫-: Quindi, negli ultimi video, abbiamo
‫permesso a un utente di reimpostare la sua
‫password e quindi crearne una
‫nuova, ma ora
‫vogliamo anche consentire a un utente che ha effettuato l'accesso
‫di aggiornare semplicemente la sua password senza
‫doverla dimenticare, e così senza l'intero processo di ripristino.
‫Quindi, costruiamolo ora.
‫E, proprio come
‫prima, facciamolo nel nostro controller di autenticazione.
‫Quindi, esporta. aggiornaPassword.
‫Va bene, e quindi, proprio come
‫sempre, i nostri tre parametri Middleware qui, e va bene.
‫Ora ricorda che questa funzionalità di aggiornamento della password è solo
‫per gli utenti che hanno
‫effettuato l'accesso, ma è comunque necessario che l'utente passi la sua password
‫corrente, quindi per confermare
‫che l'utente è effettivamente chi dice di essere.
‫Quindi, solo come misura di sicurezza
‫perché immagina che qualcuno possa trovare il tuo computer aperto e
‫quindi essere in grado di modificare le password sui
‫siti che hai
‫attualmente aperti senza che venga richiesta nuovamente una password.
‫E quindi in pratica ti
‫disconnetterebbe da tutte le tue applicazioni esistenti,
‫il che sarebbe, ovviamente, un'esperienza terribile.
‫E quindi, come misura di sicurezza, dobbiamo
‫sempre chiedere la password corrente prima di aggiornarla, va bene.
‫E, con questo in mente, esponiamo tutti
‫i passaggi che dobbiamo
‫compiere per implementare questa funzionalità proprio come prima.
‫Quindi, per prima cosa, dobbiamo prendere l'utente
‫dalla raccolta, in pratica.
‫Quindi, in secondo luogo, dobbiamo
‫verificare se la password pubblicata è corretta.
‫Destra.
‫Quindi, terzo, quindi se la password è
‫corretta, aggiorna la password.
‫E infine, dobbiamo eseguire nuovamente l'accesso dell'utente,
‫quindi in pratica per inviare nuovamente il jsonwebtoken all'utente,
‫ora connesso con la nuova password appena aggiornata.
‫Ok, e in realtà è tutto molto simile a
‫quello che abbiamo già
‫fatto prima, quindi lascio questo
‫per te come una sfida, ok?
‫Quindi, per favore, prova ad andare avanti e implementalo da
‫solo e, se necessario, puoi ovviamente dare un'occhiata al
‫codice che abbiamo scritto
‫prima, ma prova davvero a scrivere il codice
‫da solo senza copiare troppo, ok ?
‫Quindi, puoi dare un'occhiata al resto del
‫codice per vedere come funziona, ma poi non limitarti a copiarlo, ok?
‫Perché allora non imparerai davvero, d'accordo.
‫Quindi, metti in pausa il video qui e ci vediamo tra un
‫secondo con la mia soluzione.
‫Ok, quindi speravo che tu fossi riuscito
‫a implementarlo e farlo funzionare, ecco come l'ho fatto.
‫Quindi, come sempre, creiamo una nuova variabile utente e lì
‫attendiamo il risultato dell'operazione User. findById, e ora
‫da dove viene effettivamente questo ID?
‫Ebbene, ricordiamo ancora che questa password di aggiornamento è solo
‫per gli autenticati, quindi per gli utenti loggati, e
‫quindi quindi, a questo punto, avremo già l'utente corrente
‫sul nostro oggetto di richiesta.
‫Ok, quindi viene dal middleware di protezione.
‫Quindi, rich. utente. id, e
‫poi ricorda che dobbiamo chiedere esplicitamente la password, ok?
‫Perché, per impostazione predefinita, non è incluso nell'output.
‫Quindi, l'abbiamo definito sullo schema, ricordi?
‫E in realtà abbiamo bisogno
‫di quella password perché ora vogliamo confrontarla con
‫quella memorizzata nel database
‫e per questo,
‫proprio come prima, useremo questo oggetto istanza che abbiamo
‫da qualche parte qui.
‫Sì, quindi CorrectPassword, che è disponibile
‫su tutti i
‫documenti utente, quindi prende prima la
‫password candidata e poi la password utente effettiva, tutto bene.
‫Oh, e ora
‫mi dà questo errore perché, ovviamente, non l'ho
‫ancora dichiarato come una funzione asincrona.
‫Quindi, asincrono, e prima di
‫dimenticarlo, includiamolo anche qui nella funzione catchAsync.
‫Ad ogni modo, proprio
‫come prima, in pratica vogliamo creare un
‫errore qui se la password corrente non è
‫corretta, quindi scriviamolo nel codice.
‫Quindi, se non utente. CorrectPassword, e
‫poi la password candidata
‫ricorda, e così quella sarà
‫in un corpo, in una proprietà che chiameremo passwordConfirm.
‫Ok, e poi come secondo argomento la password effettiva, quindi questo
‫è un utente. parola d'ordine.
‫E poi, ricorda che questa è una funzione
‫asincrona, quindi dobbiamo aspettarla anche qui.
‫Bene, quindi nel caso in cui la password non sia
‫corretta, come sempre, creiamo un nuovo errore qui.
‫Quindi, nuovo AppError, e questa volta stiamo
‫dicendo che la tua password attuale è sbagliata, e
‫quindi il codice di stato 401 per non autorizzato.
‫Va bene, fantastico.
‫Ora, se arriviamo a questo punto nel
‫codice, quindi in pratica se anche la password è
‫corretta, allora possiamo effettivamente aggiornare la password,
‫e come lo facciamo?
‫Bene, molto semplice, l'abbiamo fatto prima.
‫Tutto ciò che diciamo è utente. la password è uguale a req. corpo. password, e
‫poi lo stesso, ovviamente, per la conferma della password.
‫Ok, e la convalida verrà eseguita automaticamente dal validatore
‫che abbiamo specificato nello schema, e verrà eseguita una volta
‫che lo avremo effettivamente salvato.
‫Quindi, aspettiamo l'utente. salva, e quindi
‫questa volta non disattiviamo la convalida
‫perché, ovviamente, vogliamo che la convalida avvenga, quindi
‫come ho detto prima, vogliamo verificare che
‫la conferma della password sia effettivamente
‫la stessa della password, giusto?
‫Bene.
‫E ora, solo per essere davvero sicuro che tu capisca perché non
‫abbiamo fatto qualcosa come user. findByIdAndUpdate.
‫Allora, perché non l'abbiamo fatto così?
‫E so che ne ho parlato molte volte prima,
‫ma voglio che capiate al cento per cento perché
‫non possiamo usare questo aggiornamento, ed è per
‫due motivi, quindi
‫lasciatemi tornare di nuovo al nostro modello.
‫Quindi, il
‫primo è che questa convalida qui non funzionerà, ok?
‫E questo è fondamentalmente perché questo. la password non
‫è definita quando aggiorniamo, quindi quando usiamo find by ID e
‫update, perché internamente, dietro
‫le quinte, Mongoose non mantiene realmente l'oggetto corrente in
‫memoria, e quindi, questo qui non funzionerà.
‫E, come ho detto, ne ho già
‫parlato prima, quindi in realtà è scritto anche qui, ok?
‫Ma è davvero importante tenere a mente di
‫non utilizzare l'aggiornamento per tutto ciò che riguarda le password, ok?
‫Quindi, questo
‫non funzionerà e anche questi
‫due Middleware pre-salvati non funzioneranno.
‫Quindi, se usassimo semplicemente update per aggiornare
‫la password, quella password non verrebbe crittografata,
‫che è questo
‫primo Middleware, e quindi anche
‫il timestamp passwordChangedAt non verrebbe impostato, ok?
‫Quindi, niente di tutto questo funzionerebbe,
‫e quindi di nuovo, abbiamo davvero bisogno di farlo in questo modo.
‫Mettiamolo di nuovo qui.
‫E così ora, (borbotta), abbiamo effettuato
‫l'accesso dell'utente e inviato il token al client.
‫Ora, questa sarebbe in realtà la quarta
‫volta che eseguiamo lo stesso codice,
‫quindi fondamentalmente questo pezzo di
‫codice, e quindi ora lo riformuliamo molto
‫rapidamente nella sua funzione.
‫Ora, questo codice in realtà non è lo stesso ovunque.
‫Quindi, qui abbiamo inviato il codice di
‫stato 400 e non
‫inviamo l'utente, ma poi quassù nel gestore di registrazione, abbiamo
‫effettivamente un codice di stato diverso
‫e abbiamo anche inviato l'utente al client, ok?
‫E quindi, facciamo in modo che la nostra funzione lo tenga a mente.
‫Quindi, creiamo una funzione qui, creiamo e inviamo token, quindi
‫gli argomenti di cui abbiamo bisogno
‫qui sono l'utente perché è lì
‫che è memorizzato l'ID.
‫Quindi, vogliamo anche
‫il codice di stato e, naturalmente, dobbiamo avere accesso
‫all'oggetto di risposta per poter effettivamente
‫inviare una risposta al client, ok?
‫E quindi, in pratica ora ciò di cui abbiamo bisogno è questo codice.
‫Quindi, copiamolo, mettiamolo qui
‫e poi sostituiamo le variabili irrilevanti.
‫Quindi, l'utente viene semplicemente chiamato utente, quindi proprio
‫così, e qui, lo stesso.
‫Quindi, non
‫un nuovo utente, e quindi qui lo sostituiamo con il codice
‫di stato, quindi quello che sta entrando nella nostra funzione,
‫e quindi immagino che sia effettivamente così.
‫Quindi, ora andiamo avanti e
‫sostituiamolo, quindi createSendToken, e qui l'utente è chiamato newUser, il codice
‫di stato è
‫201 e quindi ovviamente l'oggetto risposta.
‫Ok, ora possiamo sbarazzarci di questo codice
‫e copiamolo.
‫Va bene, quindi nel log in abbiamo ovviamente inviato anche un
‫token, ma questa volta l'utente si chiama effettivamente utente e il codice
‫di stato è 200.
‫E ora, copiamo questo.
‫Quindi, il prossimo dovrebbe essere qui, e reimpostare la password,
‫e qui in realtà
‫è lo stesso, quindi il nome è utente
‫e codice 200, e ora, finalmente, anche qui è lo stesso.
‫E così, questo completa la nostra funzione di aggiornamento della password.
‫Ora, per farlo funzionare,
‫dobbiamo ovviamente implementare il percorso anche qui nel nostro
‫router utente.
‫Quindi, router. patch, e faremo una patch
‫perché stiamo effettivamente cambiando, quindi stiamo manipolando il
‫documento utente, e quindi è a questo che serve patch.
‫E il percorso si chiama updateMyPassword.
‫Quindi, la mia
‫password perché è per l'utente attualmente connesso, quindi ricorda,
‫di nuovo, funziona solo per gli
‫utenti registrati, quindi dobbiamo usare authController. proteggere, che quindi metterà
‫anche l'oggetto utente
‫su un oggetto richiesta, ok?
‫Quindi, proteggi e poi authController aggiorna la password
‫che abbiamo appena creato, va bene.
‫E quindi, ora andiamo avanti e proviamo questo, ok?
‫Quindi, copiamo questo percorso qui, quindi UpdateMyPassword,
‫e ora ciò che
‫dobbiamo inviare nel corpo sono queste tre password in
‫realtà, quindi è fondamentalmente
‫la passwordCurrent, e per ora le lascio vuote,
‫voglio semplicemente
‫mettere il campo nomi qui per ora.
‫Quindi, passwordCurrent quindi solo password, che è
‫fondamentalmente quella
‫nuova, e poi, ovviamente, passwordConfirm.
‫Ok, e ora abbiamo effettivamente bisogno di accedere come
‫utente perché ricorda, funziona solo se
‫l'utente ha già effettuato l'accesso, va bene.
‫E quindi, facciamolo con l'amministratore qui.
‫E questa qui è, dovrebbe essere ancora la password
‫corrente, e infatti, ora siamo registrati.
‫E ricorda che questo token ora
‫viene archiviato nella variabile
‫di ambiente JWT, quindi, qui, per
‫autenticarci, usiamolo proprio come abbiamo fatto prima.
‫Quindi, in questa scheda di autorizzazione, selezioniamo Bearer
‫Token e quindi precompilerà automaticamente
‫questa variabile JWT.
‫Va bene, quindi è da
‫lì che verrà effettivamente l'ID utente, ricordi?
‫Ad ogni modo, ora specifichiamo la password corrente, quindi pass1234,
‫e poi diciamo newpassword, ok?
‫Copialo e incollalo
‫qui, ma in realtà di nuovo, voglio
‫iniziare testandolo con una conferma di password
‫errata, solo per vedere se la nostra
‫convalida funziona ancora e ora il percorso non
‫è definito, ma è semplicemente perché stiamo usando il verbo sbagliato qui.
‫Certo, deve essere patch.
‫Proviamo di nuovo, ma
‫ora sappiamo che la tua password attuale è sbagliata, ma in
‫realtà non lo è, quindi in realtà è corretta.
‫Quindi, qualcosa deve essere sbagliato nel nostro codice, quindi
‫proviamo a dare un'occhiata qui.
‫E sì, quindi ecco
‫in realtà il problema perché non vogliamo confrontare o confermare la
‫password, ovviamente, ma con la password corrente.
‫Ok, quindi è solo uno stupido bug, va bene, e
‫quindi ora dovrebbe funzionare.
‫Quindi, ovviamente, vogliamo confrontare la password
‫corrente con quella
‫attualmente memorizzata nel database, va bene.
‫Quindi, proviamo di
‫nuovo, e questo è l'errore di convalida che stavamo
‫cercando, quindi le password non
‫sono le stesse perché, in effetti, non lo sono.
‫E ora, prima di aggiornare effettivamente la password,
‫diamo un'occhiata a Compass qui.
‫Aggiorniamolo qui velocemente e quindi,
‫in questo momento, questa è la password.
‫Quindi, la fine qui è pW1i, ok?
‫Quindi, aggiorniamo la password
‫ora e vediamo come sarà dopo, ok?
‫Quindi, ora dovrebbe essere tutto corretto.
‫E, in effetti, otteniamo il nostro successo e il nostro token, eccome.
‫Quindi, confermiamolo qui velocemente, e, in
‫effetti, vedi che la password è cambiata
‫e anche il timestamp corrente,
‫quindi l'ora in cui fondamentalmente sto registrando questo video.
‫Va bene, e ora, proprio come
‫prima, otteniamo questo test qui.
‫Quindi, fondamentalmente archiviando il token come variabile di ambiente.
‫Quindi, solo così tutto funziona davvero qui a Postman.
‫Ok, salviamolo in realtà,
‫aggiorniamo la password dell'utente corrente per renderla davvero esplicita,
‫e sì, penso che sia così.
‫Penso che questo sia tutto ciò che dobbiamo fare
‫per aggiornare la password di un utente.
‫Successivamente, implementeremo l'aggiornamento di altri dati utente, quindi
‫cose come e-mail o password.