‫Istruttore: In questo video e nei
‫prossimi, implementeremo una funzionalità di
‫reimpostazione della password intuitiva, che è una specie di
‫standard nella maggior parte delle applicazioni web.
‫E probabilmente, hai già utilizzato la reimpostazione della password
‫su alcuni siti Web e di solito
‫funziona in questo modo.
‫Devi solo fornire il tuo indirizzo
‫e-mail e riceverai un'e-mail con un link
‫su cui puoi fare clic e questo ti
‫porterà a una pagina in cui puoi inserire una nuova password.
‫Questa è una procedura molto standard e quindi
‫è anche come la implementeremo
‫qui in questa applicazione.
‫Fondamentalmente ci sono due passaggi.
‫Per il primo è che l'utente invia una richiesta
‫di posta a un percorso con password dimenticata, solo con questo indirizzo email.
‫Questo creerà quindi un token
‫di ripristino e lo invierà all'indirizzo e-mail fornito.
‫Solo un semplice token casuale, non un token Web JSON.
‫Questa è una differenza qui.
‫Quindi nella seconda parte, che sarà il
‫prossimo video, l'utente invia quel token dalla sua e-mail
‫insieme a una nuova password per aggiornare la sua password.
‫Fondamentalmente, avremo esportazioni punto password dimenticata che è il
‫primo passo.
‫Quindi richiesta, risposta e poi, come secondo passaggio,
‫abbiamo reimpostato la password.
‫Allora andiamo avanti anche noi e implementiamo questi due percorsi.
‫Ok, e questo è, ovviamente, nel loro router utente o nel
‫file dei percorsi utente.
‫Mettiamole anche qui e in
‫realtà posso semplicemente duplicare queste righe qui.
‫Quindi abbiamo nuovamente dimenticato la password,
‫che riceverà solo
‫l'indirizzo e-mail e quindi reimposta la password, che riceverà
‫il token oltre alla nuova password.
‫Questo è quello
‫che inizieremo ad implementare in questa lezione.
‫Come prima, specifichiamo qui i nostri passaggi.
‫Quindi, per prima cosa, ottieni l'utente
‫in base all'e-mail pubblicata,
‫quindi genera il token casuale.
‫E poi in pratica rispedirlo come e-mail.
‫Questa roba è abbastanza comune per noi a questo punto.
‫Quindi utente, quindi aspettiamo che l'utente trovi il punto e ora
‫ne trova uno, non
‫trova per ID perché non conosciamo l'ID dell'utente.
‫E l'utente, ovviamente, non conosce il proprio ID
‫e quindi abbiamo specificato l'indirizzo email.
‫Fondamentalmente è l'unico dato noto.
‫E questo è l'indirizzo e-mail su richiesta dot body dot.
‫E ovviamente ora dobbiamo dire
‫che siamo in una funzione asincrona e quindi, proprio come prima, avvolgiamola
‫in catch async.
‫Dagli un salvataggio e l'errore dovrebbe essere sparito.
‫Quindi il passaggio successivo, verifichiamo
‫se l'utente esiste.
‫Quindi, se nessun utente, torna al middleware successivo insieme,
‫ovviamente, a un nuovo errore.
‫Nessun utente con quell'indirizzo email.
‫E poi possiamo mettere un 404, che come già
‫sai, significa non trovato.
‫Successivamente, generiamo il token casuale e per
‫questo, ancora una
‫volta, creeremo un metodo istantaneo sull'utente.
‫Perché ancora una volta, questo ha davvero a che fare
‫con i dati dell'utente stessi.
‫E scriveremo davvero un po' di
‫codice, quindi, se fosse solo una riga
‫di codice, allora potremmo inserirla proprio qui.
‫Ma abbiamo bisogno di un paio
‫di righe di codice e quindi, di nuovo, è
‫un po' più pulito separarlo in una propria funzione.
‫E quello di solito con Mongoose è il migliore come metodo istantaneo.
‫Quindi quaggiù, modifichiamo qui alla fine.
‫Quindi i metodi dei punti dello schema utente creano un token di reimpostazione della password.
‫Un nome piuttosto lungo e descrittivo.
‫Mi piace farlo così, così
‫so esattamente con cosa ho a che fare.
‫Il token di reimpostazione della password dovrebbe essere fondamentalmente una stringa casuale
‫ma, allo stesso tempo, non
‫deve essere crittograficamente forte come l'hash della password che abbiamo
‫creato in precedenza.
‫Possiamo semplicemente usare la funzione di byte casuali
‫molto semplice dal modulo crittografico integrato.
‫Andiamo avanti e aggiungiamolo davvero.
‫Crypto richiede e, di nuovo, è un modulo nodo integrato, quindi
‫non è necessario installare nulla.
‫Freddo.
‫Ora, generiamo effettivamente il nostro token.
‫E per questo, usiamo byte casuali di punti crittografici e
‫quindi qui dobbiamo specificare fondamentalmente il numero
‫di caratteri.
‫E poi, alla fine,
‫lo convertiamo in una stringa esadecimale.
‫Due
‫stringhe e quindi possiamo specificare l'opzione esadecimale qui.
‫Ora, se ti
‫stai chiedendo perché stiamo effettivamente
‫creando questo token, immagino di non averlo ancora spiegato davvero.
‫Fondamentalmente questo token è ciò che
‫invieremo all'utente e quindi è come una password di ripristino
‫che l'utente può quindi utilizzare per creare una nuova password reale.
‫E, naturalmente, solo l'utente avrà accesso a questo token.
‫E quindi, in effetti, si comporta davvero come una password.
‫Poiché essenzialmente è solo una password, significa
‫che se un hacker può accedere al nostro database,
‫allora ciò consentirà all'hacker di accedere
‫all'account impostando una nuova password.
‫Se memorizziamo semplicemente questo token di ripristino
‫nel nostro database ora, se un utente malintenzionato ottiene l'accesso al
‫database, potrebbe quindi utilizzare quel token
‫e creare una nuova password utilizzando quel token invece
‫di farlo tu.
‫Quindi controllererebbero efficacemente il tuo account invece
‫di farlo tu.
‫Proprio come una password, non dovremmo
‫mai memorizzare un semplice token di ripristino nel database.
‫Criptiamolo in realtà, ma
‫come prima con la password, non
‫ha bisogno di un metodo di crittografia
‫crittograficamente forte.
‫Perché questi token di ripristino sono un vettore di
‫attacco molto meno pericoloso.
‫Ancora una volta, useremo solo il modulo
‫crittografico integrato.
‫Funziona in questo modo dall'aspetto strano.
‫Diciamo crypto, quindi creiamo hash con l'algoritmo
‫sha 256, quindi dobbiamo dire update e
‫poi variabile
‫in cui è memorizzato il token.
‫Qualunque stringa vogliamo crittografare in pratica.
‫E poi dobbiamo dire digest e poi di nuovo
‫memorizzarlo come esadecimale.
‫E ora dove salveremo effettivamente questo token di ripristino?
‫Bene, creeremo un nuovo campo nel nostro schema del database.
‫Perché ovviamente vogliamo salvarlo nel database, in
‫modo da poterlo
‫confrontare con il token fornito dall'utente.
‫Facciamolo qui alla fine.
‫Token di reimpostazione della password, questa
‫è la stringa.
‫E poi scade anche la reimpostazione della password.
‫Perché questo ripristino scadrà
‫effettivamente dopo un certo periodo di tempo come misura di sicurezza.
‫Avrai solo 10 minuti per reimpostare effettivamente
‫la tua password.
‫Ora andiamo avanti e usiamo questi.
‫Questo token di reimpostazione della password del punto è quindi uguale
‫a questa crittografia.
‫Successivamente, impostiamo la scadenza della reimpostazione della password e
‫impostiamolo su data dot ora e quindi aggiungiamo semplicemente un
‫paio di secondi a quello.
‫Vogliamo che funzioni per 10 minuti
‫e quindi sono 10 e poi ne abbiamo bisogno in millisecondi.
‫Tempi 60 per secondi e poi volte 1000 per millisecondi.
‫E poi voglio anche restituire il token di testo normale
‫perché in realtà è quello che invieremo
‫tramite l'e-mail.
‫Restituisci token di ripristino.
‫Dobbiamo inviare via e-mail il
‫token di ripristino non crittografato perché
‫altrimenti non avrebbe molto senso crittografarlo.
‫Se il token che
‫era nel database fosse esattamente lo stesso
‫che potremmo usare per cambiare effettivamente
‫la password, beh, allora non sarebbe affatto una crittografia.
‫Abbiamo inviato un token via
‫e-mail e quindi abbiamo la versione crittografata nel nostro database.
‫E quello crittografato è quindi praticamente inutile
‫per cambiare la password.
‫È proprio come quando
‫salviamo solo la password crittografata stessa
‫nel database, proprio come abbiamo fatto qui, quindi
‫dove abbiamo crittografato la password usando bcrypt.
‫Tieni presente che l'unico in assoluto salva
‫i dati sensibili in un formato crittografato
‫e quindi confrontali con la versione crittografata presente
‫nel database.
‫Basta registrare questi due sulla console
‫che renderà le nostre vite un po' più facili lungo la strada.
‫Diciamo reset token e sto accedendo qui
‫come oggetto
‫perché in questo modo mi dirà effettivamente il nome
‫della variabile insieme al suo valore.
‫E poi lo stesso con questo token di reimpostazione della password del punto.
‫Questo non funziona davvero con la
‫scrittura di oggetti, questo nuovo modo ES6 e
‫lasciamo le cose a questo.
‫Comunque, torniamo qui
‫e poi usiamo quella funzione.
‫Quindi ricorda come abbiamo restituito il token di
‫ripristino e memorizziamolo qui.
‫Quindi il token di ripristino è uguale al set di punti utente e non
‫sono più sicuro del nome.
‫Crea un token di reimpostazione della password,
‫quindi è lungo.
‫Va bene e così è stato fatto, ma
‫in realtà quello che abbiamo fatto è stato solo modificare
‫i dati qui.
‫Quando impostiamo questa password punto scade per esempio a
‫questo valore, in effetti non abbiamo
‫realmente aggiornato il documento.
‫Non l'abbiamo salvato.
‫In realtà lo
‫modifichiamo, ma ora dobbiamo salvarlo.
‫Diciamo che attendi il salvataggio del punto dell'utente.
‫Ma guarda cosa succede mentre ora lo usiamo.
‫Prendiamo questo qui.
‫Questo è il percorso che abbiamo trovato prima.
‫E ora otteniamo questo percorso non ancora definito.
‫Vediamo perché è così.
‫Nel percorso dell'utente, abbiamo chiaramente lo stesso URL qui, ma vedo che
‫in realtà abbiamo bisogno di fare una richiesta di posta.
‫Va bene, ok, ma ora riceviamo un errore che
‫dice di fornire email e password.
‫E quindi è quello che intendevo quando ho
‫detto guarda cosa succede quando provi questo.
‫Ciò accade perché stiamo cercando di salvare un documento,
‫ma non specifichiamo tutti i dati obbligatori, quindi i
‫campi che abbiamo contrassegnato come obbligatori.
‫Risolviamolo rapidamente.
‫Tutto ciò che dobbiamo fare è passare effettivamente un'opzione speciale
‫in questo metodo di salvataggio dei punti utente.
‫Diciamo
‫convalida prima di salvare
‫impostato su false.
‫Questo disattiverà quindi tutti i validatori che abbiamo
‫specificato nel nostro schema.
‫Sono queste piccole cose che devi sapere
‫che faranno la differenza.
‫Ora, in realtà non sapevo nemmeno che esistesse
‫perché nessuno conosce davvero tutte le cose.
‫È impossibile.
‫Una biblioteca come Mongoose è semplicemente troppo grande per farti
‫sapere tutto quello che c'è.
‫Sono andato avanti e ho letto la documentazione
‫di Mongoose ed è lì che ho trovato questa opzione estremamente utile.
‫Tutto questo solo per dire che
‫nessuno sa tutto e
‫quindi è davvero una buona abitudine,
‫se incontri
‫qualche problema, dare un'occhiata alla
‫documentazione per la libreria che stai utilizzando.
‫Diamo un'occhiata a questo ora.
‫E riceviamo ancora lo stesso errore qui, ma
‫vedo qui che in
‫realtà proviene dalla funzione di accesso.
‫Diamo un'occhiata a cosa sta succedendo qui.
‫Diamo un'occhiata anche ai percorsi.
‫Ah, ok, quindi ecco il problema.
‫Ora stiamo provando a chiamare
‫il gestore di accesso, che ovviamente non ha senso.
‫Qui è la password dimenticata.
‫Qui è reimpostare la password.
‫E quindi l'errore che abbiamo ricevuto prima in realtà non era
‫dovuto alla convalida.
‫Inviamo questo di nuovo e
‫ora riceviamo l'errore che non c'è
‫nessun utente con
‫questo indirizzo e-mail e quindi questo perché non abbiamo
‫specificato alcun indirizzo e-mail nel corpo.
‫L'abbiamo testato
‫e quindi ora è il momento di
‫testarlo effettivamente con un'e-mail dell'utente.
‫Va bene.
‫E quindi ora in realtà
‫non dovrebbe fare nulla perché non inviamo alcuna risposta.
‫Cancelliamolo perché tutto
‫ciò che mi interessava
‫era vedere questi token qui e
‫poi anche dare un'occhiata all'oggetto utente.
‫Questo qui è il token di ripristino originale, quindi
‫vedi che è una stringa esadecimale casuale e
‫poi abbiamo quello crittografato qui.
‫Questo ricordo è quello che non dovrebbe essere nel
‫database, quindi termina con a901.
‫Diamo un'occhiata a questo.
‫E infatti, eccolo qui,
‫il token di reimpostazione della password che termina con questo a901.
‫E anche la data, che infatti è tra 10 minuti.
‫Ora sai a che ora sto registrando questo video.
‫Comunque, ma questo ha funzionato bene.
‫E quindi questa è in realtà la
‫prima parte della creazione di questa funzionalità di reimpostazione della password.
‫Nel prossimo video, invieremo
‫quindi questo token qui via e-mail all'utente e quindi in
‫realtà abbiamo preparato un video separato solo
‫per imparare come inviare effettivamente e-mail con node
‫a js.
‫È molto divertente,
‫quindi non aspettare di trasferirti lì subito.