‫-: Zuvor haben wir
‫also bereits eine einfache Anmeldefunktion implementiert,
‫aber in
‫diesem Vortrag werden wir den Benutzer
‫tatsächlich auch für einen realeren Anmeldevorgang anmelden.
‫Ab diesem Vortrag werden wir
‫also wirklich damit beginnen, unsere Authentifizierung zu
‫implementieren, und hier wird es wirklich ernst.
‫Deshalb möchte ich Sie hier, bevor
‫wir beginnen, warnen, dass es
‫sehr schwierig ist, die Authentifizierung richtig zu machen, und es
‫gibt viele Tutorials, die Sie finden werden,
‫wenn Sie mit Node
‫nach Authentifizierung suchen. js und
‫Express machen viele von ihnen viele schwerwiegende
‫Fehler und vereinfachen Dinge, die nicht vereinfacht werden sollten.
‫In Ordnung, das soll nicht heißen, dass alle Tutorials
‫da draußen schlecht,
‫in Ordnung oder nutzlos sind
‫oder so, aber ich verbringe wirklich Wochen damit, alle Best Practices zu
‫recherchieren und meinen Code zu verfeinern und
‫zu verbessern, um diesen Authentifizierungsabschnitt
‫so zu gestalten, dass wir Ich werde jetzt so gut
‫wie möglich mit der Implementierung beginnen, für einen
‫Anfänger wie Sie, in Ordnung, und das liegt daran, dass
‫wir beim Schreiben dieses Teils der Anwendung wirklich besonders vorsichtig sein müssen,
‫denn denken Sie daran, dass hier die Daten unserer Benutzer auf dem
‫Spiel stehen , und das Vertrauen in das Unternehmen,
‫das die Anwendung ausführt,
‫steht auf dem Spiel, und so
‫ist die Implementierung der Authentifizierung eine
‫echte Verantwortung, bei der Sie überhaupt keine Fehler machen sollten.
‫Nun gibt es einige
‫Bibliotheken, die uns bei der Implementierung
‫von Authentifizierung und Autorisierung helfen können, und die
‫bekannteste heißt Passport, aber
‫selbst eine solche
‫Bibliothek nimmt Ihnen nicht die ganze Arbeit
‫und die ganze Verantwortung ab.
‫In diesem
‫Fall werden wir die
‫gesamte Anmeldeschutz- und Autorisierungslogik selbst implementieren, mit
‫Ausnahme der Jason-Webtoken-Implementierung, über die wir im
‫letzten Video selbst gesprochen haben.
‫Okay, das ganze Unterschreiben und Verifizieren,
‫das ganze Zeug, überlassen wir der WJT-Bibliothek, aber
‫den Rest werden wir
‫in den nächsten Vorlesungen selbst umsetzen.
‫Wie ich bereits erwähnt
‫habe, haben wir hier bereits unsere Anmeldefunktion, aber im
‫Moment müssen
‫Sie nur einen neuen Benutzer erstellen
‫und ihn dann an den Client zurücksenden.
‫Nun, kurz nachdem ich die Aufzeichnung dieses Kurses
‫beendet
‫hatte, bemerkte ich tatsächlich, dass
‫diese Art der Benutzeranmeldung eine sehr
‫schwerwiegende Sicherheitslücke aufweist. Im Grunde besteht
‫das Problem also darin, dass wir im Moment einen
‫neuen Benutzer erstellen, der alle
‫eingehenden Daten verwendet das Body-Recht, und das Problem
‫hier ist, dass so jeder die Rolle als Admin-Recht festlegen kann,
‫also kann sich im Grunde jetzt jeder einfach als Admin
‫in unserer Anwendung
‫registrieren, und das brauchen wir natürlich nicht.
‫Dies ist also wieder eine ernsthafte Sicherheitslücke, die
‫wir natürlich beheben müssen, und das
‫Beheben ist eigentlich ganz einfach.
‫Was Sie also anstelle dieser Codezeile, die hier
‫ausgewählt ist, benötigen, ist
‫dieses Codestück, das ich gerade hier auf dem Bildschirm platziert habe.
‫Okay.
‫Also löschen Sie bitte noch einmal diese Codezeile, die derzeit hier
‫ausgewählt ist, und ersetzen Sie sie
‫durch den Code, den ich gerade hier auf dem
‫Bildschirm eingefügt habe.
‫Nun, was ist eigentlich der große Unterschied
‫hier, nun, mit diesem
‫neuen Code lassen wir im Grunde nur die Daten zu, die
‫wir tatsächlich in den neuen Benutzer
‫eingeben müssen, also nur einen Namen, die E-Mail und dann die Passwörter.
‫Selbst wenn ein Benutzer versucht, eine Rolle manuell einzugeben, speichern wir
‫dies jetzt nicht im neuen Benutzer, und
‫dasselbe gilt für andere
‫Dinge, wie zum Beispiel ein Foto.
‫Dies ist die schnelle und einfache Lösung für dieses Problem.
‫Was
‫dies nun bewirkt, ist, dass wir uns eigentlich nicht mehr als Admin
‫registrieren können. Wenn wir also einen neuen Administrator
‫zu unserem System
‫hinzufügen müssen, können wir ganz einfach normal einen neuen Benutzer
‫erstellen und dann in MongoDB Compass gehen.
‫und bearbeiten Sie im Grunde diese Rolle dort.
‫Bearbeiten Sie es
‫also manuell vom Benutzer zum Administrator, okay.
‫Natürlich könnten wir auch eine spezielle Route
‫definieren, um nur Admins
‫zu erstellen, aber das wäre etwas zu viel.
‫Okay, also lass uns jetzt weitermachen.
‫Beachten Sie nur, dass der Code im Rest
‫des Videos und in allen
‫Videos in diesem Kurs natürlich immer noch diese alte falsche Version sein wird,
‫gut, aber tatsächlich im endgültigen Code, der
‫sich im GitHub-Repository befindet, habe
‫ich das bereits behoben und wir habe den richtigen Code drin.
‫Wie auch immer, normalerweise, wenn wir uns für eine Webanwendung anmelden,
‫werden Sie auch automatisch eingeloggt, richtig, also lassen Sie
‫uns das hier sehr schnell implementieren.
‫Also den neuen Benutzer einloggen,
‫sobald er sich angemeldet hat, okay, und denk
‫an den vorherigen Vortrag, wie das
‫funktioniert, naja alles was wir
‫eigentlich tun müssen, ist einen
‫Jason Web Token zu signieren und
‫dann an den Benutzer zurück zu senden , okay, aber
‫jetzt installieren wir zuerst das MPM-Paket, das wir für
‫alles verwenden werden, was mit Jason-Webtoken
‫zu tun hat.
‫Also in unserem anderen Terminal,
‫sagen wir MPM install, Jason Web Token, also all das zusammen so
‫und das sollte dann
‫dieses Paket installieren und lass es
‫uns tatsächlich
‫auf GitHub anschauen, nur um die
‫Dokumentation zu sehen und lass
‫uns Machen Sie
‫das hier, wir brauchen dieses hier
‫zumindest jetzt nicht mehr, und so gelangen wir zur Seite über MPM, und
‫Sie sehen, wie beliebt
‫dieses Paket tatsächlich ist, also
‫haben wir 2. 3 Millionen Downloads
‫pro Woche, das sind wirklich eine Menge Downloads
‫und wir können uns auch hier die Dokumentation
‫ansehen, aber ich persönlich bevorzuge es auf GitHub.
‫Ich finde, es sieht hier viel sauberer aus,
‫und ich bin an dieser
‫Stelle so daran gewöhnt, und deshalb sehe ich es normalerweise nur hier, okay.
‫Wie auch immer, die erste Funktion, die
‫wir hier mit JWT verwenden werden, ist sign, okay, also um
‫im Grunde ein neues Token zu erstellen, und dafür brauchen
‫wir natürlich die Nutzlast, brauchen wir
‫den Schlüssel für das private Geheimnis, das ich erwähnt
‫habe vorher
‫ist das nur auf unserem Server gespeichert und
‫wir müssen den Token signieren und
‫dann können wir einige Optionen weitergeben und
‫wir werden das alles in einer Sekunde
‫tun, ich möchte nur die andere Funktion zeigen, die wir
‫hier haben, und die wir wirklich haben Wir haben
‫hier eine Menge Optionen, zum Beispiel
‫das Ablaufdatum, das wir auch verwenden werden,
‫also all das Zeug und
‫dann müssen wir es überprüfen.
‫Wir haben also auch über den Verifizierungsprozess gesprochen
‫und der ist im Grunde in dieser Funktion implementiert, okay, und
‫das ist der, den wir
‫verwenden werden, wenn wir einen Benutzer anmelden, okay, und das
‫ist wirklich alles, also hast
‫du alles diese verschiedenen Optionen hier,
‫okay, du musst auch
‫dekodieren, aber das ist nicht wirklich wichtig, okay,
‫du siehst also, dass dieses Paket wirklich nur
‫die beiden
‫Funktionalitäten enthält, die wir im vorherigen Video besprochen haben.
‫Also unterschreiben und dann verifizieren, okay.
‫Lassen Sie uns also hierher zurückkehren
‫und tatsächlich mit der Verwendung des Jason-Webtoken-Pakets beginnen.
‫Lassen Sie es
‫uns hier importieren, und es heißt
‫normalerweise einfach JWT und erfordert das Jason-Webtoken.
‫Okay, also lasst uns hier unser Token erstellen,
‫okay, und ich
‫nenne es einfach so, also einfach Token, okay, dann
‫JWT-Punktzeichen, und jetzt ist das erste die Nutzlast, und das ist im
‫Grunde ein Objekt für alle die
‫Daten, die wir im Token
‫speichern werden, und in diesem Fall wollen
‫wir
‫wirklich nur die ID des Benutzers, in Ordnung, also
‫nichts Verrücktes hier, nicht viele Daten, die
‫nicht wirklich wichtig sind.
‫Also sagen wir, dass die ID ist
‫und dann holen wir uns einfach
‫die ID des neuen Benutzers, der gerade erstellt wurde,
‫okay, also neuer Benutzer Punkt und dann denken Sie daran, dass die ID
‫in MonogoDB tatsächlich Unterstrich-ID heißt, in Ordnung, und so ist
‫das Objekt mit den Daten,
‫der Nutzlast, die wir in unser JWT einfügen möchten.
‫Als nächstes brauchen wir das Geheimnis, okay, also
‫im Grunde eine
‫Zeichenfolge für ein Geheimnis,
‫okay, das ist natürlich ein schreckliches, okay, das ist
‫nur eine Art Platzhalter, denn
‫eigentlich ist unsere Konfigurationsdatei ein perfekter
‫Ort um diese Art von geheimen Daten zu speichern, also wie
‫zum Beispiel das Passwort, also lass uns
‫hier hinzufügen und bearbeiten, okay, also nennen wir es JWT, geheim,
‫und natürlich der Name, den wir hier geben, ist nicht wirklich wichtig,
‫aber was zählt, ist das Geheimnis,
‫das
‫wir hier angeben, gut, denn bei Verwendung der Standard-HSA-256-Verschlüsselung
‫für die Signatur sollte das Geheimnis mindestens 32 Zeichen lang sein, gut, aber je
‫länger, desto besser, und hier kommen viele Tutorials da
‫draußen scheitern, einige von ihnen geben hier
‫einfach eine sehr kurze Zeichenfolge
‫ein, aber das ist wieder nicht
‫ideal, also sollten Sie für die beste Verschlüsselung
‫der Signatur wieder mindestens
‫zweiunddreißig Zeichen verwenden, also werde ich
‫jetzt mein Geheimnis hier schaffen aber du solltest wirklich wirklich
‫einen anderen benutzen, okay,
‫bitte benutze nicht den sa mir eins, wie ich
‫es tue, weil das ein Sicherheitsproblem für
‫Ihre Anwendung werden könnte, okay,
‫verwenden Sie immer ein
‫einzigartiges Geheimnis für Ihre Anwendungen und nie das gleiche,
‫in Ordnung, und vor allem
‫nicht das von jemand anderem, also definitiv
‫nicht das, das ich habe schreibe jetzt.
‫Das kann also
‫alles sein, es müssen keine seltsamen Charaktere
‫oder so sein, ich bevorzuge es,
‫einen Satz wie diesen zu
‫verwenden, mein ultrasicheres und ultralanges Geheimnis, also was ist
‫hier passiert, das sollte
‫sowieso zweiunddreißig Zeichen lang sein und so Dies ist
‫der,
‫den wir für meine Jason-Webtoken verwenden werden, aber
‫bitte verwenden Sie wieder einen anderen, in Ordnung.
‫Wie auch immer, kehren wir hier zum Authentifizierungscontroller zurück und verwenden
‫ihn jetzt tatsächlich.
‫Denken Sie also daran,
‫dass eine Umgebungsvariable Prozesspunkt Ende Punkt JWT-Geheimnis ist,
‫okay.
‫An diesem Punkt haben wir also die Nutzlast
‫und wir haben das Geheimnis.
‫Der Token-Header wird tatsächlich automatisch erstellt, aber jetzt
‫können wir
‫auch einige Optionen weitergeben, und
‫die Option, die ich übergeben
‫werde, ist, wann das JWT ablaufen sollte.
‫Das bedeutet also, dass nach
‫der Zeit, die wir
‫hier verstreichen werden, der
‫Jason-Webtoken
‫nicht mehr gültig ist, auch wenn er
‫sonst korrekt verifiziert
‫würde, in Ordnung, also im Wesentlichen
‫zum Abmelden eines Benutzers nach
‫a bestimmten Zeitraum einfach als Sicherheitsmaßnahme, okay.
‫Lassen Sie uns diese Ablaufzeit hier also auch
‫als Konfigurationsvariable definieren,
‫damit JWT abläuft und hier natürlich die gleiche Zeit wie
‫von mir angegeben verwendet
‫werden kann.
‫Wir können also eine
‫spezielle Zeichenfolge wie zum Beispiel 90D verwenden
‫und der Signaturalgorithmus wird dann automatisch herausfinden,
‫dass dies neunzig Tage bedeutet, okay, du könntest auch zehn
‫Stunden oder fünf Minuten oder drei Sekunden oder so ähnlich verwenden, oder einfach eine
‫beliebige Zahl , die dann als
‫Millisekunden behandelt
‫werden, aber ich denke, es ist am
‫besten, einfach neunzig oder so zu
‫verwenden D, also in diesem Fall neunzig Tage, in Ordnung,
‫und so wird das
‫JWT nach neunzig Tagen wieder nicht mehr gültig
‫sein, selbst wenn die Unterschrift ist korrekt und alles ist gültig.
‫Okay, also wieder nur als zusätzliche Sicherheitsmaßnahme, okay, also
‫diese
‫Optionen wie immer, wir haben sie als Objekt
‫übergeben und dann spezifizieren wir das
‫läuft ab in, also läuft ab und dann verarbeiten Sie Punktende und
‫dann JWT läuft ab in, okay, und dies hier fügt dann der
‫Nutzlast einige zusätzliche Daten hinzu,
‫aber das ist
‫natürlich überhaupt kein Problem.
‫Also haben wir gerade ein Token
‫erstellt, jetzt müssen wir
‫es nur noch an den Client senden.
‫Also lasst es uns hier vor den Benutzer stellen und
‫dann ist es tatsächlich soweit.
‫Das ist wirklich alles, was wir tun müssen, um einen
‫neuen Benutzer anzumelden, denn wir
‫prüfen im Moment nicht,
‫ob ein Passwort korrekt ist oder ob der Benutzer tatsächlich in
‫der Datenbank existiert, da
‫der Benutzer in diesem Fall in
‫diesem Fall
‫wirklich gerade erstellt wurde, und Also
‫haben wir den Benutzer sofort in die
‫Anwendung eingeloggt, indem wir ein Token
‫gesendet haben, okay, und die Verwendung von Client sollte
‫dann dieses Token in gewisser Weise speichern, so
‫wie wir es zuvor
‫in der vorherigen Vorlesung besprochen haben, okay, also speichern wir es ab hier, und lass
‫es uns tatsächlich ausprobieren, okay, also lass uns meine
‫alte Adresse hier, hello@jonas. io, senden wir es
‫und warten wir darauf und tatsächlich,
‫hier ist unser Jason-Webtoken, also herzlichen Glückwunsch, du hast gerade
‫deinen allerersten Jason-Webtoken erstellt, der ein
‫bisschen so aussehen sollte, und natürlich wird
‫er nicht genau so aussehen gleich,
‫denn unser Geheimnis ist auch nicht dasselbe,
‫richtig, und was ich euch jetzt zeigen möchte,
‫ist der JWT-Debugger,
‫den ich euch als Screenshot
‫weiter oben im letzten Video
‫gezeigt habe.
‫Lassen Sie uns also weitermachen und
‫dieses Token kopieren und dann zu JWT gehen. io, okay, dann haben
‫wir
‫hier unten den Debugger und
‫also lasst uns diesen hier löschen und unsere setzen
‫und sofort sehen Sie, dass unsere
‫Signatur ungültig ist, aber das liegt
‫daran, dass die Sign-Funktion diese beiden Eigenschaften
‫hier bearbeitet, weil
‫wir ein Ablaufdatum angegeben haben Datum grundsätzlich.
‫Das hier wird also ausgegeben um,
‫und das ist die Ablaufzeit, okay, also
‫wenn wir diese beiden von hier entfernen, werden Sie sehen,
‫dass diese
‫Signatur jetzt tatsächlich verifiziert ist, okay
‫also, was hier wichtig zu beachten ist, ist natürlich der
‫Header ist in Ordnung, es ist im
‫Grunde leicht zu entschlüsseln, und damit Sie, dass
‫wir nichts davon angegeben haben, war es das
‫Jason-Web-Token-Paket, das es für uns getan hat, aber hier ist
‫tatsächlich die Nutzlast, die wir angegeben haben, also wenn wir einen
‫Blick darauf werfen bei dieser
‫ID sollte es genau das gleiche sein wie
‫bei postman, also auf sechs OF
‫enden, und so ist es tatsächlich genau das gleiche richtig,
‫ok, also diese beiden hier sind offen
‫und dann die Unterschrift natürlich können wir nicht wirklich sehen,
‫denn unser Geheimnis ist natürlich genau das, es
‫ist wirklich geheim, in Ordnung, das war also nur,
‫um Ihnen zu zeigen, dass alles funktioniert, und lass
‫uns das schließen, und
‫ja, wir können keine Benutzer einloggen, aber nur wenn sich der Benutzer
‫gerade angemeldet hat, denn in diesem
‫Fall müssen wir die E-Mail in der Datenbank
‫nicht überprüfen und
‫auch nicht die Passwort, ok.
‫All dies zu tun ist also ein viel
‫komplexerer Prozess, und das werden
‫wir in der nächsten
‫Vorlesung tun. Als nächstes werden wir die
‫Benutzer anhand ihrer E-Mail-Adresse und ihres Passworts anmelden.