‫Kursleiter: Wir müssen dem
‫Benutzer nun das Token zum Zurücksetzen des Passworts per E-Mail senden.
‫In diesem Vortrag lernen wir,
‫wie Sie E-Mails mit einer sehr beliebten Lösung
‫namens Nodemailer senden.
‫Aber bevor wir das tun, wollte ich
‫Ihnen eigentlich die Wirkung zeigen, diese Option hier nicht zu haben,
‫da ich Ihnen eigentlich noch nie zuvor gezeigt habe.
‫Lassen Sie uns es hier abschneiden, versuchen Sie es jetzt
‫noch einmal, und jetzt sehen Sie alle diese Fehler, die
‫auftauchen. Bitte bestätigen Sie Ihr Passwort.
‫Und eigentlich sollte es noch mehr
‫geben, aber nun, das ist jetzt der erste, den Sie bekommen.
‫Im Grunde, weil wir keinen
‫Wert im Feld zur Passwortbestätigung haben.
‫Okay?
‫Und das liegt wiederum an der
‫Validierung und wir können es natürlich wieder mit
‫dieser Option einfach deaktivieren.
‫Aber egal, lassen Sie uns jetzt eine E-Mail-Handler-Funktion erstellen, die
‫wir dann in unserer gesamten Anwendung verwenden können.
‫Also werde ich
‫das hier im Utilities-Ordner wieder
‫tun und es einfach E-Mail nennen. js.
‫Gut?
‫Und bevor wir
‫etwas anderes tun, installieren wir das Nodemailer-Paket.
‫Das ist also das Paket, das ich gleich zu
‫Beginn erwähnt habe und das
‫wir verwenden werden, um E-Mails mit Node. js.
‫Also, wie immer, npm install nodemailer.
‫Und hier drin.
‫In Ordnung, und jetzt erstellen wir diese Funktion hier.
‫Also ständige E-Mails, okay,
‫und dann
‫werden wir hier im Grunde einige Optionen durchgehen.
‫Also die E-Mail-Adresse, an die wir eine E-Mail
‫senden möchten, die Betreffzeile, den E-Mail-Inhalt und
‫vielleicht noch einige andere Dinge.
‫Gut.
‫Jetzt müssen wir also drei Schritte
‫ausführen, um E-Mails mit Nodemailer zu senden.
‫Zuerst müssen wir also einen Transporter erstellen.
‫Als
‫nächstes müssen wir im Grunde die E-Mail-Optionen definieren und
‫dann am
‫Ende die E-Mail tatsächlich mit Nodemailer senden.
‫Okay?
‫Der Transporter, den wir hier im ersten Schritt erstellt haben,
‫ist im Grunde genommen ein Dienst, der die E-Mail tatsächlich sendet, da er
‫kein Knoten ist. js, das
‫die E-Mail tatsächlich sendet.
‫Es ist nur ein Service, den wir hier definieren.
‫Etwas wie Gmail zum Beispiel.
‫Nun, Gmail ist nicht wirklich der
‫Dienst, den wir
‫verwenden werden, aber lassen Sie mich Ihnen kurz
‫zeigen, wie es mit Gmail funktioniert, weil ich weiß,
‫dass viele Leute daran interessiert sein werden, okay?
‫Wir müssen also sowieso immer einen Transporter erstellen, und der ist
‫immer derselbe,
‫egal welchen Dienst wir nutzen.
‫Der Transporter wird also Nodemailer
‫sein. createTransport und
‫dann brauchen wir da natürlich einige Optionen.
‫Gut?
‫Wir können also den Dienst angeben und
‫sagen, dass wir Gmail verwenden möchten.
‫Also einfach so.
‫Und es gibt ein paar
‫bekannte Dienste, mit denen Nodemailer umzugehen weiß,
‫und wir müssen diese nicht manuell konfigurieren.
‫Und so ist Gmail nur einer davon.
‫Aber es gibt auch Yahoo oder Hotmail oder viele andere, okay?
‫Das ist also
‫der Dienst, und dann müssen wir auch noch die Auth-Eigenschaft angeben, also
‫im Grunde für die Authentifizierung.
‫Wir brauchen also einen Benutzer und ein Passwort.
‫Und genau wie zuvor speichern
‫wir solche Sachen in unserer Konfiguration. n-Datei.
‫Gut.
‫E-Mail,
‫das ist ein
‫Benutzername, und jetzt werde ich hier keine echte
‫Gmail-Adresse verwenden, da wir wiederum
‫kein Gmail verwenden, aber hier nur als Beispiel, in Ordnung.
‫Ihr Passwort.
‫Gut.
‫Also hier sind wir fertig,
‫sagen
‫wir, Prozess Punkt Ende
‫Punkt EMAIL_USERNAME das
‫Passwort Prozess Punkt End Punkt EMAIL_PASSWORD
‫und ich hoffe, dass
‫ich diese richtig geschrieben habe.
‫Okay?
‫Dies ist also
‫die Konfiguration für den Transport im Nodemailer.
‫Dann müssen Sie in
‫Ihrem Gmail-Konto tatsächlich
‫die so genannte weniger sichere App-Option aktivieren.
‫Also lass mich das hier aufschreiben.
‫Und noch einmal, ich werde es hier
‫nicht tun, aber ich
‫weiß, dass viele Leute es tatsächlich verwenden wollen.
‫Und der Grund, warum wir Gmail in
‫dieser Anwendung nicht verwenden,
‫ist, dass Gmail für eine Produktions-App überhaupt keine
‫gute Idee ist.
‫Und das ist im Grunde das, was wir hier aufbauen wollen.
‫Okay?
‫Wenn Sie also Gmail für diese Art
‫von Dingen verwenden, können Sie nur 500 E-Mails pro
‫Tag senden, und Sie werden wahrscheinlich sehr schnell
‫als Spammer gekennzeichnet, und von da an geht es nur noch bergab.
‫Gut?
‫Es sei denn, es ist wie eine private
‫App und Sie senden nur E-Mails an
‫sich selbst oder an 10
‫Freunde, nun, dann sollten Sie einen anderen Dienst nutzen.
‫Und einige bekannte sind SendGrid und Mailgun.
‫Und tatsächlich werden wir SendGrid etwas später in
‫diesem Kurs verwenden.
‫Was wir jetzt tun werden,
‫ist, einen speziellen Entwicklungsdienst zu verwenden, der
‫im Grunde fälscht, um E-Mails an echte Adressen zu senden.
‫In Wirklichkeit landen diese E-Mails jedoch in einem
‫Entwicklungspostfach, sodass wir uns dann ansehen können, wie sie
‫später in der Produktion aussehen werden.
‫Gut?
‫Dieser Dienst heißt also Mailtrap, also melden
‫wir uns jetzt dafür an.
‫So.
‫Brieffalle. ja, alles
‫klar?
‫Also, und wie gesagt, sichere E-Mail-Tests
‫für Staging und Entwicklung.
‫Im Grunde können
‫Sie mit diesem Dienst also fälschen, um E-Mails an Kunden
‫zu senden, aber diese E-Mails erreichen diese Kunden
‫dann nie und bleiben stattdessen in Ihrer Mailtrap gefangen, okay?
‫Auf diese Weise können
‫Sie nicht versehentlich einige Entwicklungs-E-Mails an alle Ihre
‫Kunden oder Benutzer senden, okay.
‫Also mach weiter und melde dich jetzt an.
‫Meinen Account habe ich natürlich schon und
‫melde mich jetzt einfach an.
‫Wir sehen uns in einer Sekunde, nachdem
‫Sie Ihr kostenloses Konto erstellt haben.
‫Alles klar, nach dem Erstellen Ihres
‫Kontos wird es wahrscheinlich ein bisschen so aussehen.
‫Jetzt haben Sie vorerst keinen Posteingang, also
‫erstellen wir einfach einen neuen mit
‫dem Namen natours.
‫Ich habe also bereits einen, aber erstelle hier einfach einen neuen
‫mit dem Namen natours und klicke dann auf Posteingang erstellen.
‫Gut?
‫Dann können wir es
‫öffnen, und Sie sehen, dass wir zu diesem Zeitpunkt
‫keine E-Mail haben, aber was
‫im Moment zählt, sind diese Anmeldeinformationen hier.
‫Sie sehen, wir haben unseren Host
‫hier, wir haben den Port, den Benutzernamen und das Passwort.
‫Und das werden wir
‫jetzt in unserem Transport in Nodemailer angeben.
‫Gut?
‫Fangen wir also mit dem Host an,
‫nun, eigentlich mit
‫dem Benutzernamen, also diese beiden muss
‫ich nur kopieren, also kopieren wir sie in unsere Konfigurationsdatei, das
‫ist also der Benutzername, dann ist
‫das das Passwort, und
‫jetzt müssen wir es auch noch den Host angeben.
‫Okay, und das liegt daran, dass Mailtrap
‫keiner dieser vordefinierten Dienste ist, die mit Nodemailer geliefert werden.
‫Gut.
‫Der Hafen ist 25.
‫Also speichern Sie es,
‫und dann lassen Sie uns das hier loswerden,
‫und was ich stattdessen angeben muss, ist
‫der
‫Host, also E-Mail,
‫Host und natürlich der Port.
‫Also alles, was wir vorher gespeichert haben.
‫Alles klar, dann ist die Authentifizierung
‫hier genau dieselbe.
‫Lassen Sie uns dies ebenfalls loswerden
‫und fahren Sie mit Schritt Nummer zwei fort.
‫Definieren Sie also grundsätzlich einige Optionen für unsere E-Mail.
‫Okay, und wir könnten natürlich
‫Schritt zwei und drei gleichzeitig machen, aber
‫ich bevorzuge diese Optionen hier einfach zuerst.
‫Okay, und hier geben wir
‫an, woher die E-Mail
‫kommt, also
‫den Namen und dann die E-Mail-Adresse wie folgt.
‫Als nächstes brauchen wir die Adresse
‫des Empfängers, und die werde ich optional angeben,
‫okay?
‫Also im Grunde genommen als Argument für diese Funktion.
‫Dieses Optionsobjekt hier ist also
‫dieses, das wir an die Funktion übergeben.
‫Gut.
‫Dann eigentlich dasselbe für das Thema und für den Text.
‫Lassen Sie uns diese
‫hier einfach duplizieren, also den Betreff
‫und dann geben wir nur die Texteigenschaft an,
‫und diese in den Optionen nenne ich es einfach Nachricht.
‫Alles klar, dies ist also im Grunde
‫die Textversion der E-Mail.
‫Wir können dann aber auch die HTML-Eigenschaft angeben.
‫Okay, und so könnten wir diese Nachricht nun in HTML umwandeln.
‫Und später werden wir das tun, aber
‫lassen Sie uns es vorerst einfach halten und den HTML-Code hier überhaupt nicht angeben.
‫Okay?
‫Also belasse es einfach bei Text.
‫Okay!
‫Und schließlich,
‫am Ende, transporter, das ist also das Transporter-Objekt,
‫das wir hier am Anfang
‫erstellt haben, und darauf können
‫wir dann sendMail aufrufen und dort unsere Mail-Optionen eingeben, okay?
‫Und jetzt gibt dies tatsächlich ein Versprechen zurück.
‫Okay, dies ist wieder eine asynchrone Funktion,
‫und da wir nicht direkt mit Promises arbeiten möchten,
‫verwenden wir async/await.
‫Gut.
‫Also als asynchrone Funktion deklarieren und
‫los gehts.
‫Gut.
‫Wir wollen hier kein Ergebnis speichern,
‫was wir könnten, aber das interessiert mich nicht wirklich.
‫Okay, und jetzt exportieren wir es einfach als
‫Standard aus diesem Modul.
‫Okay, sieht gut aus!
‫Lassen Sie uns nun weitermachen und dies tatsächlich versuchen.
‫Um zu beginnen, müssen wir es natürlich hier importieren.
‫Lassen Sie uns das hier
‫einfach duplizieren,
‫also ist dies eine E-Mail und die Funktion heißt sendEmail, denke ich.
‫Okay.
‫Kehren wir also zu unserer Middleware-Funktion hier zurück und beginnen
‫wir mit der Definition der Reset-URL.
‫Idealerweise klickt der Benutzer dann auf diese E-Mail und kann
‫dann die Anfrage von dort aus ausführen.
‫Und das wird
‫später funktionieren, wenn wir unsere dynamische
‫Website implementieren, aber trotzdem wollen wir diese URL jetzt hier erstellen,
‫damit der Benutzer sie einfach kopieren
‫kann, um diese Anfrage zu erleichtern.
‫Okay, im Grunde müssen wir
‫diese URL-Struktur, die wir hier haben, neu erstellen.
‫Dieses hier ist also für das vergessene Passwort
‫und lass es uns hier speichern.
‫Also, Passwort vergessen, und jetzt ist die URL, die wir erstellen,
‫eigentlich für das Zurücksetzen des Passworts.
‫Denken Sie also daran, dass wir das tatsächlich schon einmal implementiert haben.
‫Okay.
‫Lass es uns
‫einfach hierher kopieren, also das Passwort zurücksetzen, in Ordnung?
‫Und das nimmt dann tatsächlich das
‫Token als Parameter.
‫Okay, also lasst uns erst einmal ein beliebiges Token hier reinlegen.
‫Es ist also völlig egal.
‫Lassen Sie
‫mich es einfach hier speichern, als Passwort zurücksetzen.
‫Okay.
‫Außerdem ist es nicht GET, es
‫ist auch kein POST, sondern
‫PATCH, da das Ergebnis die Änderung der
‫Kennworteigenschaft im Benutzerdokument ist.
‫Und so ist PATCH eigentlich das Beste, okay?
‫Lassen Sie uns also schnell unsere Routenimplementierung dafür ändern.
‫Es ist also hier in userRoute, also
‫nicht POST, sondern PATCH, und
‫wir möchten auch einen Parameter angeben.
‫Denken Sie also daran, wie wir das tun.
‫Es ist also wie hier unten.
‫Also ein weiterer Schrägstrich, dann Doppelpunkt und dann der
‫Name des Parameters, der als Token verwendet wird.
‫Okay, und lassen Sie uns
‫das jetzt aufbauen, beginnend mit dem Protokoll.
‫Also HTTP oder HTTPS, okay?
‫Und wir werden diese Daten im Grunde aus unserer Anfrage bekommen.
‫Das wird also auf Anfrage
‫gespeichert, Punktprotokoll, dann Doppelpunkt Schrägstrich Schrägstrich und dann der Host, okay?
‫Also bereiten wir dieses hier im Grunde darauf vor, sowohl in
‫der Entwicklung als auch in der Produktion zu arbeiten.
‫Fordern Sie also dot get an und hosten
‫Sie dann.
‫In Ordnung, so bekommen wir den
‫Host und dann Slash-API-Slash-Version eins, und ich denke, es ist nicht
‫ideal, eine solche Stufe hartcodiert zu definieren,
‫aber auch
‫dies ist etwas, das wir
‫etwas später beheben werden. okay?
‫Und ich sehe, dass das eigentlich nicht richtig ist.
‫Diese geschweiften Klammern sollten da sein.
‫Also, jetzt, Benutzer,
‫resetPassword und
‫dann noch ein Schrägstrich und schließlich das Token.
‫Okay, also resetToken.
‫Gut?
‫Und wie wir bereits im letzten Vortrag
‫besprochen haben, müssen
‫wir hier tatsächlich den einfachen, originalen resetToken senden und nicht den verschlüsselten.
‫Gut?
‫Wir werden dann
‫im nächsten Schritt den Original-Token mit dem verschlüsselten vergleichen.
‫Also noch einmal, so wie wir es im letzten Video besprochen haben.
‫Speichern Sie es jetzt hier, und das ist unsere Reset-URL.
‫Und jetzt lassen Sie uns basierend auf dieser URL auch hier
‫schnell die Nachricht erstellen.
‫Also, Passwort vergessen?
‫Senden Sie eine PATCH-Anfrage mit Ihrem neuen
‫Passwort und PasswortBestätigen Sie
‫natürlich an
‫die soeben erstellte Reset-URL, okay?
‫Im Grunde geben Sie dem Benutzer hier einige Anweisungen.
‫Dann sagen wir in einer neuen
‫Zeile auch, wenn Sie Ihr Passwort nicht vergessen haben, ignorieren
‫Sie diese E-Mail bitte.
‫Das ist also eine allgemeine Botschaft, und
‫ich bin sicher, Sie haben es auf die eine oder
‫andere Weise gesehen, in Ordnung.
‫Lassen Sie uns nun endlich die E-Mail senden und
‫denken Sie daran, dass sendEmail eine
‫asynchrone Funktion ist.
‫Daher müssen wir hier darauf warten.
‫Okay?
‫Denn natürlich wird es ein Versprechen zurückgeben.
‫Und denken Sie jetzt daran, dass die Funktion sendEmail
‫hier ein Objekt mit einigen Optionen übernimmt.
‫Die E-Mail ist also Benutzer. E-Mail, oder?
‫Oder wir könnten auch sagen, req. Karosserie. Email.
‫Das ist eigentlich genau das gleiche, oder?
‫Dann ist das Thema, das
‫wir sagen möchten, Ihr Token zum Zurücksetzen des Passworts.
‫Sagen wir gleich, dass es nur 10 Minuten gültig
‫ist, damit der Benutzer weiß, dass er sich beeilen muss.
‫Okay, und dann endlich auch die Nachricht.
‫Okay.
‫Also warten wir das
‫ab, und danach senden wir natürlich auch eine Antwort.
‫Okay, es muss immer eine Antwort geben,
‫sonst wird der
‫Anfrage-Antwort-Zyklus, wie Sie bereits wissen, nie abgeschlossen.
‫Wir senden also einfach einen
‫200-Code und dann eine schön formatierte Nachricht mit
‫dem Status „Erfolg“
‫und dann nur eine kurze Nachricht
‫mit der Aufschrift „Token an E-Mail gesendet“.
‫Gut.
‫Und natürlich können wir den Reset-Token nicht direkt hierher senden,
‫direkt nebenan, denn dann könnte jeder einfach das
‫Passwort von jedem
‫zurücksetzen und jedes gewünschte Konto übernehmen.
‫Aus diesem Grund senden wir sie an
‫eine E-Mail-Adresse, da wir davon ausgehen, dass
‫die E-Mail ein sicherer Ort
‫ist, auf den nur der Benutzer Zugriff hat.
‫Gut.
‫Whoo, also, dieses Video läuft wieder ziemlich lang, aber wir
‫sind noch nicht fertig.
‫Wir sind fast fertig, aber nicht ganz,
‫denn es könnte ein Fehler
‫passieren, wenn Sie diese sendEmail verwenden, okay, und in diesem Fall
‫möchten wir natürlich eine Fehlermeldung an den Client senden.
‫Aber in diesem Fall müssen wir tatsächlich mehr tun,
‫als nur eine Fehlermeldung zu senden.
‫Wir müssen im Grunde genommen das Passwort-Reset-Token zurücksetzen
‫und das Passwort-Reset ist abgelaufen, das wir definiert haben, okay?
‫Im Moment reicht es also nicht aus,
‫den Fehler einfach abzufangen und dann
‫an unsere globale Middleware zur Fehlerbehandlung zu senden.
‫Aber stattdessen müssen wir hier
‫einfach einen Try-Catch-Block hinzufügen.
‫Da wir also eigentlich
‫mehr tun wollen, als nur einen Fehler
‫an den Client zu senden, versuchen
‫wir dies grundsätzlich, richtig, aber im
‫Fehlerfall wird natürlich dieser Block hier ausgeführt.
‫Gut?
‫Was wir in diesem Fall also tun
‫wollen, nun, wir wollen im Grunde,
‫wie gesagt, sowohl das Token als auch die Expires-Eigenschaft zurücksetzen.
‫Okay.
‫Also, passwordResetToken, und
‫setzen Sie es auf undefined, in Ordnung.
‫Und das gleiche gilt für passwordResetExpires.
‫Okay.
‫Und dann werden natürlich nach
‫wie vor die Daten nur modifiziert, aber nicht wirklich gespeichert.
‫Also lass uns hinzufügen, greifen und
‫so die Daten in diesem Fall im Grunde speichern.
‫Okay, und zum Schluss kehren
‫wir dann natürlich mit einem Fehler zur nächsten
‫Middleware zurück.
‫Also newAppError,
‫Beim Senden der E-Mail ist ein Fehler aufgetreten.
‫Versuchen Sie es später erneut.
‫Und in diesem Fall kann der Fehlercode tatsächlich eine 500 sein.
‫Das ist also wirklich wie ein Fehler, der auf dem
‫Server aufgetreten ist, und es muss ein Fünf-Code
‫sein, und 500 ist nur so etwas wie der Standardcode.
‫Gut.
‫Also, lass uns jetzt weitermachen und es noch einmal ausprobieren, in Ordnung.
‫Das ist also wieder ziemlich lang, aber wir müssen
‫es tun, oder?
‫Also, Passwort vergessen, mit dieser E-Mail schauen wir es uns an.
‫Dies kann also nicht lange
‫dauern, weil die E-Mail gesendet wurde,
‫aber tatsächlich hat es jetzt funktioniert, dauerte etwa fünf Sekunden, aber wir
‫sehen, dass Token an E-Mail gesendet wurde.
‫und so, wie wir wissen, hat Mailtrap diese E-Mail nicht an
‫hello@jones gesendet, da wir Mailtrap verwendet haben. io, aber
‫stattdessen sollte die E-Mail jetzt
‫in Mailtrap eingeschlossen sein.
‫Und tatsächlich ist es hier auf der linken Seite jetzt aufgetaucht.
‫Gut.
‫Das ist also die E-Mail, die wir angegeben haben, und
‫hier erhalten wir unsere schöne URL.
‫Okay, also die, die wir mit dem Protokoll, dem Host und
‫dann auch mit dem Token erstellt haben.
‫Schauen wir also einfach mal
‫nach, ob dies
‫wirklich unser Plain-Token ist,
‫also auf 88df endet, und tatsächlich haben wir hier resetToken, 88df.
‫Und jetzt sollten wir in der
‫Datenbank das Token mit der Endung 1111 haben.
‫Also, lassen Sie uns das hier in
‫Compass bestätigen, laden Sie es neu, und tatsächlich können wir loslegen, okay?
‫Und so ist es wieder hier in 10 Minuten.
‫Großartig, also haben wir diesen Teil abgeschlossen.
‫Als nächstes, im nächsten Video, werden wir
‫dann das Passwort tatsächlich zurücksetzen,
‫natürlich basierend auf dem neuen Passwort, das
‫der Benutzer mit der Anfrage zum Zurücksetzen des Passworts sendet.
‫Also, wir sehen uns dort.