‫Istruttore: Quindi, ora
‫dobbiamo inviare il token di reimpostazione della password via e-mail all'utente.
‫E quindi in questa lezione
‫impareremo come inviare e-mail utilizzando una soluzione molto
‫popolare chiamata Nodemailer.
‫Ma prima di farlo, in realtà
‫volevo mostrarti l'effetto di non avere questa opzione qui, perché
‫in realtà non te l'ho mai mostrato prima.
‫Quindi tagliamo qui, provalo ora, di nuovo, e ora
‫vedi tutti questi errori che compaiono come per
‫favore conferma la tua password.
‫E, in realtà, dovrebbero essercene di
‫più, ma, beh, questo è ora il primo che ottieni.
‫Fondamentalmente, perché non abbiamo alcun
‫valore nel campo di conferma della password.
‫Va bene?
‫E così di nuovo, è a causa
‫della convalida e quindi di nuovo possiamo, ovviamente, disattivarlo
‫facilmente con questa opzione.
‫Ma comunque, ora creiamo una funzione di gestione della posta elettronica
‫che possiamo quindi utilizzare in tutta la nostra applicazione.
‫Quindi lo farò
‫proprio qui nella cartella Utilità,
‫di nuovo, e lo chiamerò semplicemente e-mail. js.
‫Va bene?
‫E prima di fare
‫qualsiasi altra cosa, installiamo effettivamente il pacchetto Nodemailer.
‫Quindi questo è il pacchetto che ho
‫menzionato all'inizio, che
‫useremo per inviare e-mail utilizzando Node. js.
‫Quindi, come sempre, npm installa nodemailer.
‫E qui dentro.
‫Va bene, e ora creiamo quella funzione qui.
‫Quindi e-mail costanti,
‫ok, e
‫poi qui, in pratica, passeremo alcune opzioni.
‫Quindi l'indirizzo e-mail a cui vogliamo inviare un'e-mail,
‫la riga dell'oggetto, il contenuto dell'e-mail
‫e forse altre cose.
‫Va bene.
‫E quindi ora dobbiamo seguire
‫tre passaggi per inviare e-mail con Nodemailer.
‫Quindi, per prima cosa, dobbiamo creare un trasportatore.
‫Quindi,
‫in secondo luogo, dobbiamo definire le opzioni di posta
‫elettronica, in pratica,
‫e alla fine, inviare effettivamente l'e-mail con Nodemailer.
‫Va bene?
‫Quindi, il trasportatore che abbiamo realizzato nel primo
‫passaggio qui, è fondamentalmente un servizio che invierà effettivamente l'e-mail, perché non
‫è un nodo. js che
‫invierà effettivamente l'e-mail stessa.
‫È solo un servizio che definiamo qui.
‫Qualcosa come Gmail, per esempio.
‫Ora, Gmail non è in realtà
‫il servizio
‫che useremo, ma lascia che ti mostri
‫rapidamente come funziona con Gmail, perché so che
‫molte persone saranno interessate a questo, ok?
‫Quindi, comunque, dobbiamo sempre creare un trasportatore, ed è sempre
‫lo stesso,
‫non importa quale servizio useremo.
‫Quindi il trasportatore sarà
‫nodemailer. createTransport e
‫poi, ovviamente, abbiamo bisogno di alcune opzioni.
‫Va bene?
‫Quindi possiamo specificare il servizio e possiamo
‫dire che vogliamo usare Gmail.
‫Quindi, proprio così.
‫E ci sono un paio
‫di servizi ben noti che Nodemailer sa
‫come gestire, quindi non dobbiamo configurarli manualmente.
‫E quindi Gmail è solo uno di questi.
‫Ma c'è anche Yahoo, o Hotmail, o molti altri, ok?
‫Quindi questo
‫è il servizio, e poi dobbiamo anche specificare la proprietà
‫auth, quindi fondamentalmente per l'autenticazione.
‫Quindi abbiamo bisogno di un utente e una password.
‫E così, proprio come prima,
‫salviamo quel tipo di cose nella nostra configurazione. n file.
‫Va bene.
‫Quindi email,
‫questo è un
‫nome utente, e ora non userò un vero
‫indirizzo Gmail qui perché, di nuovo,
‫non stiamo usando Gmail, ma solo come esempio qui, va bene.
‫La tua password.
‫Va bene.
‫Quindi qui abbiamo finito, diciamo,
‫processo
‫punto fine punto
‫EMAIL_USERNAME il
‫processo password punto fine punto
‫EMAIL_PASSWORD e spero
‫di averli digitati correttamente.
‫Va bene?
‫E quindi questa è
‫la configurazione per il trasporto in Nodemailer.
‫Quindi nel tuo account
‫Gmail, dovrai effettivamente
‫attivare qualcosa chiamato l'opzione dell'app meno sicura.
‫Quindi lascia che lo scriva qui.
‫E ancora, non lo farò
‫qui, ma so
‫che molte persone vorranno davvero usarlo.
‫E il motivo per cui non utilizziamo Gmail
‫in questa applicazione è
‫perché Gmail non è affatto una buona idea per
‫un'app di produzione.
‫E quindi questo è fondamentalmente ciò che stiamo cercando di costruire qui.
‫Va bene?
‫Quindi, usando Gmail per questo tipo
‫di cose, puoi inviare solo 500 e-mail al
‫giorno e, inoltre, verrai probabilmente contrassegnato molto
‫rapidamente come spammer e, da lì, andrà solo in discesa.
‫Va bene?
‫Quindi, a meno che non sia come un'app
‫privata e non invii e-mail a te
‫stesso o, ad esempio,
‫10 amici, beh, allora dovresti usare un altro servizio.
‫E alcuni noti sono SendGrid e Mailgun.
‫E, in realtà, useremo SendGrid un po' più avanti
‫in questo corso.
‫Ora, quello che faremo adesso
‫è usare uno speciale servizio di sviluppo,
‫che fondamentalmente fa finta di inviare email a indirizzi reali.
‫Ma, in realtà, queste e-mail finiscono intrappolate in una casella
‫di posta di sviluppo, in modo che possiamo quindi dare un'occhiata
‫a come appariranno in seguito nella produzione.
‫Va bene?
‫Quindi quel servizio si chiama
‫Mailtrap, quindi ora iscriviamoci.
‫Così.
‫Trappola. io, va
‫bene?
‫Quindi, e come ho detto, test di posta elettronica sicuri per
‫la messa in scena e lo sviluppo.
‫Quindi, in pratica,
‫con questo servizio, puoi fingere di inviare e-mail ai
‫client, ma queste e-mail non raggiungeranno mai
‫questi client e verranno invece intrappolate nel tuo Mailtrap, ok?
‫E in questo modo
‫non puoi inviare accidentalmente alcune e-mail di sviluppo a
‫tutti i tuoi clienti o utenti, ok.
‫Quindi vai avanti e iscriviti ora.
‫Io, ovviamente, ho già il mio account,
‫quindi ora effettuerò semplicemente l'accesso.
‫Quindi ci vediamo tra un secondo, dopo
‫aver creato il tuo account gratuito.
‫Va bene, quindi dopo aver creato il
‫tuo account, probabilmente assomiglierà un po' a questo.
‫Ora, non avrai alcuna casella di posta per
‫ora, quindi creiamone una nuova, con il
‫nome di natours.
‫Quindi, ne ho già uno, ma creane uno nuovo qui, con
‫il nome natours, e poi premi Crea posta in arrivo.
‫Va bene?
‫Quindi possiamo aprirlo
‫e vedi che non abbiamo email a questo
‫punto, ma ciò che conta
‫per ora sono queste credenziali qui.
‫Quindi vedi che abbiamo il nostro host
‫qui, abbiamo la porta, il nome utente e la password.
‫E quindi è quello che
‫specificheremo ora nel nostro trasporto in Nodemailer.
‫Va bene?
‫Quindi iniziamo con l'host, beh, in realtà,
‫con il nome
‫utente, quindi questi due, devo solo
‫copiarli, quindi copiamolo nel nostro file di configurazione, quindi questo
‫è il nome utente, quindi questa
‫è la password, e
‫ora in realtà abbiamo anche bisogno di specificare l'ospite.
‫Ok, e questo perché Mailtrap non è
‫uno di questi servizi predefiniti forniti con Nodemailer.
‫Va bene.
‫Il porto è 25.
‫Quindi salvalo, e poi
‫qui dentro, liberiamoci di questo, e quello
‫che devo specificare invece è l'host,
‫quindi
‫e-mail, host
‫e, naturalmente, la porta.
‫Quindi tutto ciò che abbiamo appena salvato prima.
‫Va bene, allora l'autenticazione qui è
‫esattamente la stessa.
‫Eliminiamo anche questo e
‫passiamo al passaggio numero due.
‫Quindi sostanzialmente definendo alcune opzioni per la nostra email.
‫Va bene, e potremmo, ovviamente, fare
‫il passaggio due e tre allo stesso
‫tempo, ma preferisco semplicemente queste opzioni qui prima.
‫Ok, quindi qui specifichiamo da
‫dove proviene l'e-mail, quindi
‫il nome
‫e poi l'indirizzo e-mail in questo modo.
‫Successivamente, abbiamo bisogno dell'indirizzo del
‫destinatario, quindi quello lo specificherò come opzione,
‫ok?
‫Quindi fondamentalmente, arrivando come argomento a questa funzione.
‫Quindi questo oggetto options
‫qui, è questo che passiamo alla funzione.
‫Va bene.
‫Poi in realtà lo stesso per il soggetto e per il testo.
‫Duplichiamo questi qui,
‫quindi l'oggetto e poi
‫specifichiamo solo la proprietà text, e
‫quella, nelle opzioni, la chiamo solo messaggio.
‫Va bene, quindi questa è fondamentalmente
‫la versione testuale dell'e-mail.
‫Ma possiamo anche specificare la proprietà HTML.
‫Ok, quindi ora possiamo convertire questo messaggio in HTML.
‫E più tardi, lo faremo, ma
‫per ora, manteniamo le cose semplici e non specifichiamo affatto l'HTML qui.
‫Va bene?
‫Quindi semplicemente lasciandolo al testo.
‫Va bene!
‫E infine, alla
‫fine, trasportatore, quindi questo è l'oggetto trasportatore che abbiamo
‫creato proprio qui all'inizio, e su
‫quello, possiamo quindi chiamare sendMail
‫e in quello dobbiamo passare le nostre opzioni di posta, ok?
‫E ora questo restituisce effettivamente una Promessa.
‫Ok, di nuovo, questa è una funzione
‫asincrona e poiché non vogliamo lavorare direttamente con
‫Promises, usiamo async/await.
‫Va bene.
‫Quindi dichiarandolo come una funzione asincrona e
‫il gioco è fatto.
‫Va bene.
‫Non vogliamo memorizzare alcun risultato qui,
‫cosa che potremmo fare, ma non mi interessa molto.
‫Ok, ora esportiamolo come predefinito da
‫questo modulo.
‫Ok, sembra buono!
‫Ora andiamo avanti e proviamo effettivamente questo.
‫E quindi, per iniziare, dobbiamo importarlo qui, ovviamente.
‫Quindi duplichiamo questo qui,
‫quindi
‫questa è e-mail e la funzione si chiama sendEmail, credo.
‫Va bene.
‫Quindi torniamo alla nostra funzione middleware qui e
‫iniziamo definendo l'URL di ripristino.
‫Quindi, idealmente, l'utente farà clic su questa e-mail e sarà quindi
‫in grado di eseguire la richiesta da lì.
‫E funzionerà in
‫seguito quando implementeremo il nostro sito
‫Web dinamico, ma comunque ora vogliamo creare questo URL qui, in
‫modo che l'utente possa semplicemente copiarlo,
‫per rendere più semplice questa richiesta.
‫Ok, quindi in pratica
‫dobbiamo ricreare questa struttura URL che abbiamo qui.
‫Quindi questo è per la password
‫dimenticata e salviamolo qui.
‫Quindi, ho dimenticato la password e ora l'URL che stiamo creando
‫è in realtà per reimpostare la password.
‫Quindi, ricorda, l'abbiamo effettivamente implementato prima.
‫Va bene.
‫Andiamo avanti e
‫copiamolo qui, quindi reimposta la password, ok?
‫E questo prenderà effettivamente il
‫token come parametro.
‫Ok, per ora inseriamo qui un qualsiasi token casuale.
‫Quindi non importa affatto.
‫Permettetemi
‫di salvarlo qui, come reimpostazione della password.
‫Va bene.
‫Inoltre, non è GET, non è nemmeno
‫POST, ma è PATCH, perché
‫il risultato sarà la modifica della proprietà della
‫password nel documento utente.
‫E quindi PATCH è il migliore in realtà, ok?
‫Quindi cambiamo rapidamente la nostra implementazione del percorso per questo.
‫Quindi, è qui in userRoute, quindi non
‫è POST, è PATCH
‫e vogliamo anche specificare un parametro.
‫Quindi, ricorda come lo facciamo.
‫Quindi è proprio come quaggiù.
‫Quindi un'altra barra, quindi due punti e quindi
‫il nome del parametro, che sarà token.
‫Ok, e costruiamolo
‫ora, iniziando dal protocollo.
‫Quindi, HTTP o HTTPS, ok?
‫E fondamentalmente otterremo quei dati dalla nostra richiesta.
‫Quindi questo viene memorizzato su richiesta
‫protocollo punto, quindi due punti barra barra barra e quindi l'host, ok?
‫Quindi stiamo praticamente preparando questo qui per lavorare
‫sia nello sviluppo che nella produzione.
‫Quindi, chiedi dot get e poi
‫host.
‫Va bene, ecco come otteniamo l'host,
‫e poi slash api slash versione uno, e immagino che non sia
‫l'ideale definire un livello hardcoded come questo, ma
‫di nuovo,
‫questo è qualcosa che sistemeremo un
‫po' più tardi, va bene?
‫E vedo che questo in realtà non è corretto.
‫Queste parentesi graffe dovrebbero esserci.
‫Quindi, ora, utenti,
‫resetPassword e
‫poi ancora un'altra barra e infine il token.
‫Ok, allora resetToken.
‫Va bene?
‫E come abbiamo discusso in precedenza,
‫nell'ultima lezione, qui
‫dobbiamo effettivamente inviare il resetToken semplice e originale e non quello crittografato.
‫Va bene?
‫Quindi, nel
‫passaggio successivo, confronteremo il token originale con quello crittografato.
‫Quindi, di nuovo, proprio come abbiamo discusso nell'ultimo video.
‫Dagli un salvataggio qui ora, e quindi questo è il nostro URL di ripristino.
‫E ora, in base a questo URL, creiamo rapidamente
‫anche qui il messaggio.
‫Allora, hai dimenticato la password?
‫Invia una richiesta PATCH con la tua nuova
‫password e passwordConferma ovviamente,
‫all'URL di
‫ripristino che abbiamo appena creato, ok?
‫Quindi, in sostanza, dando all'utente alcune istruzioni qui.
‫Quindi, su una nuova riga,
‫diciamo anche che se non hai dimenticato la password,
‫ignora questa email.
‫Quindi questo è un messaggio comune, e
‫di nuovo, sono sicuro che l'hai visto in un
‫modo o nell'altro, va bene.
‫Quindi ora, finalmente, inviamo l'e-mail e
‫ricordiamo che sendEmail è
‫una funzione asincrona.
‫E quindi, dobbiamo aspettarlo qui.
‫Va bene?
‫Perché, ovviamente, restituirà una Promessa.
‫E ricorda ora che la funzione sendEmail qui
‫accetta un oggetto con alcune opzioni.
‫Quindi l'e-mail è utente. e-mail, giusto?
‫Oppure potremmo anche dire, req. corpo. e-mail.
‫Quindi è esattamente lo stesso, in realtà, giusto?
‫Quindi l'argomento che vogliamo
‫dire è il token di reimpostazione della password.
‫Diciamo subito che è valido solo per 10
‫minuti, in modo che l'utente sappia che deve sbrigarsi.
‫Ok, e poi finalmente anche il messaggio.
‫Va bene.
‫Quindi, lo aspettiamo,
‫e poi inviamo anche, ovviamente, qualche risposta.
‫Ok, quindi ci deve sempre essere una
‫risposta, altrimenti, come già
‫sai, il ciclo di richiesta/risposta non finirà mai.
‫Quindi inviamo semplicemente un codice
‫200 e poi un messaggio ben formattato con
‫uno stato di
‫successo, e poi solo un messaggio
‫veloce che dice, Token inviato a e-mail.
‫Va bene.
‫E, ovviamente, non possiamo inviare il token di ripristino proprio qui, accanto,
‫giusto, perché, in tal caso, tutti potrebbero semplicemente ripristinare la
‫password di chiunque e
‫prendere il controllo di qualsiasi account desiderassero.
‫E quindi questo è l'intero motivo per cui
‫lo inviamo a un indirizzo e-mail, perché
‫presumiamo che l'e-mail sia un
‫luogo sicuro, a cui solo l'utente ha accesso.
‫Va bene.
‫Whoo, quindi, anche questo video è piuttosto lungo, ma
‫non abbiamo ancora finito.
‫Abbiamo quasi finito, ma non del
‫tutto, perché potrebbe verificarsi un
‫errore utilizzando questo sendEmail, ok, quindi in tal caso, ovviamente,
‫vogliamo inviare un messaggio di errore al client.
‫Ma in questo caso, in realtà dobbiamo fare di più
‫che inviare semplicemente un messaggio di errore.
‫In pratica, dobbiamo ripristinare il token di reimpostazione della password
‫e la reimpostazione della password è scaduta che abbiamo definito, ok?
‫E quindi in questo momento non è
‫sufficiente rilevare semplicemente l'errore e inviarlo
‫al nostro middleware di gestione degli errori globale.
‫Ma invece dobbiamo semplicemente aggiungere un
‫blocco try-catch proprio qui.
‫Quindi di nuovo, perché in realtà
‫vogliamo fare di più che semplicemente inviare un
‫errore al client, quindi proviamo fondamentalmente a
‫farlo, giusto, ma nel caso ci sia un
‫errore, allora, ovviamente, questo blocco qui viene eseguito.
‫Va bene?
‫Quindi quello che vogliamo fare in quel
‫caso, beh, in pratica, come ho
‫detto, vogliamo reimpostare sia il token che la proprietà scade.
‫Va bene.
‫Quindi, passwordResetToken e
‫impostalo su undefined, va bene.
‫E lo stesso per passwordResetExpires.
‫Va bene.
‫E poi, ovviamente, proprio come
‫prima, questo modifica solo i dati, ma non li salva davvero.
‫E quindi andiamo ad aggiungere, prendi questo,
‫e quindi in pratica per salvare i dati in questo caso.
‫Ok, e poi solo per
‫finire, ovviamente, poi torniamo con un errore al
‫prossimo middleware.
‫Quindi newAppError,
‫si è verificato un errore durante l'invio dell'e-mail.
‫Riprovare più tardi.
‫E in questo caso, il codice di errore può essere effettivamente un 500.
‫Quindi questo è davvero allora, come un errore che è
‫successo sul server, e quindi deve essere un
‫codice cinque, e 500 è proprio, come quello standard.
‫Va bene.
‫Quindi, ora andiamo avanti e proviamo di nuovo, va bene.
‫Quindi questo è di nuovo piuttosto lungo, ma, beh,
‫dobbiamo farlo, giusto?
‫Quindi, password dimenticata, con questa email diamo un'occhiata.
‫Quindi questo potrebbe non
‫richiedere molto tempo, a causa dell'invio
‫dell'e-mail, ma in realtà ha funzionato ora, ci sono voluti cinque
‫secondi, ma vediamo Token inviato all'e-mail.
‫e quindi, come sappiamo, poiché abbiamo usato Mailtrap, in realtà non
‫ha inviato questa email a hello@jones. io ma
‫invece l'e-mail dovrebbe essere ora
‫intrappolata all'interno di Mailtrap.
‫E, in effetti, qui sul lato sinistro, ora è apparso.
‫Va bene.
‫Quindi, questa è l'e-mail che abbiamo specificato e qui
‫otteniamo il nostro bel URL.
‫Ok, quindi quello che abbiamo creato con il protocollo, l'host
‫e poi anche con il token.
‫Quindi diamo solo un'occhiata se
‫questo è davvero
‫il nostro token semplice,
‫quindi termina in 88df e, in effetti, abbiamo resetToken qui, 88df.
‫E ora nel database, dovremmo
‫avere il token che termina con 1111.
‫Quindi, confermiamo che, qui
‫in Compass, ricaricalo e, in effetti, ci siamo, ok?
‫E così di nuovo, questo qui è tra 10 minuti da adesso.
‫Fantastico, quindi abbiamo finito quella parte.
‫Successivamente, nel prossimo video, reimposteremo effettivamente
‫la password, in base,
‫ovviamente, alla nuova password che
‫l'utente invia con la richiesta di reimpostazione della password.
‫Allora, ci vediamo lì.