Authentifizierung hinzufügen
Im vorherigen Kapitel haben Sie die Rechnungs-Routen fertiggestellt, indem Sie Formularvalidierung hinzugefügt und die Barrierefreiheit verbessert haben. In diesem Kapitel werden Sie Ihrem Dashboard Authentifizierung hinzufügen.
Was ist Authentifizierung?
Authentifizierung ist heute ein zentraler Bestandteil vieler Webanwendungen. Dabei überprüft ein System, ob der Benutzer tatsächlich derjenige ist, für den er sich ausgibt.
Eine sichere Website verwendet oft mehrere Methoden, um die Identität eines Benutzers zu überprüfen. Beispielsweise kann die Site nach der Eingabe von Benutzername und Passwort einen Bestätigungscode an Ihr Gerät senden oder eine externe App wie Google Authenticator verwenden. Diese Zwei-Faktor-Authentifizierung (2FA) erhöht die Sicherheit. Selbst wenn jemand Ihr Passwort kennt, kann er ohne Ihren eindeutigen Token nicht auf Ihr Konto zugreifen.
Authentifizierung vs. Autorisierung
In der Webentwicklung haben Authentifizierung und Autorisierung unterschiedliche Rollen:
- Authentifizierung stellt sicher, dass der Benutzer derjenige ist, für den er sich ausgibt. Sie beweisen Ihre Identität mit etwas, das Sie haben, wie einem Benutzernamen und Passwort.
- Autorisierung ist der nächste Schritt. Sobald die Identität eines Benutzers bestätigt ist, entscheidet die Autorisierung, welche Teile der Anwendung er nutzen darf.
Authentifizierung überprüft also, wer Sie sind, während Autorisierung bestimmt, was Sie in der Anwendung tun oder aufrufen dürfen.
Die Login-Route erstellen
Erstellen Sie zunächst eine neue Route in Ihrer Anwendung namens /login
und fügen Sie den folgenden Code ein:
Sie werden feststellen, dass die Seite <LoginForm />
importiert, die Sie später in diesem Kapitel aktualisieren werden. Diese Komponente ist mit React <Suspense>
umschlossen, da sie auf Informationen aus der eingehenden Anfrage (URL-Suchparameter) zugreifen wird.
NextAuth.js
Wir werden NextAuth.js verwenden, um Ihrer Anwendung Authentifizierung hinzuzufügen. NextAuth.js abstrahiert einen Großteil der Komplexität bei der Verwaltung von Sitzungen, An- und Abmeldung sowie anderen Aspekten der Authentifizierung. Obwohl Sie diese Funktionen manuell implementieren könnten, wäre der Prozess zeitaufwendig und fehleranfällig. NextAuth.js vereinfacht den Prozess und bietet eine einheitliche Lösung für die Authentifizierung in Next.js-Anwendungen.
NextAuth.js einrichten
Installieren Sie NextAuth.js, indem Sie den folgenden Befehl in Ihrem Terminal ausführen:
Hier installieren Sie die beta
-Version von NextAuth.js, die mit Next.js 14+ kompatibel ist.
Generieren Sie als Nächstes einen geheimen Schlüssel für Ihre Anwendung. Dieser Schlüssel wird verwendet, um Cookies zu verschlüsseln und so die Sicherheit der Benutzersitzungen zu gewährleisten. Sie können dies tun, indem Sie den folgenden Befehl in Ihrem Terminal ausführen:
Fügen Sie dann in Ihrer .env
-Datei Ihren generierten Schlüssel zur Variable AUTH_SECRET
hinzu:
Damit die Authentifizierung in der Produktion funktioniert, müssen Sie auch Ihre Umgebungsvariablen in Ihrem Vercel-Projekt aktualisieren. Lesen Sie diese Anleitung, um zu erfahren, wie Sie Umgebungsvariablen auf Vercel hinzufügen.
Die pages-Option hinzufügen
Erstellen Sie eine Datei auth.config.ts
im Stammverzeichnis unseres Projekts, die ein authConfig
-Objekt exportiert. Dieses Objekt enthält die Konfigurationsoptionen für NextAuth.js. Vorerst wird es nur die pages
-Option enthalten:
Sie können die pages
-Option verwenden, um die Route für benutzerdefinierte Anmelde-, Abmelde- und Fehlerseiten anzugeben. Dies ist nicht erforderlich, aber durch das Hinzufügen von signIn: '/login'
zu unserer pages
-Option wird der Benutzer zu unserer benutzerdefinierten Login-Seite weitergeleitet, anstatt zur Standardseite von NextAuth.js.
Ihre Routen mit Next.js Middleware schützen
Fügen Sie als Nächstes die Logik hinzu, um Ihre Routen zu schützen. Dies verhindert, dass Benutzer auf die Dashboard-Seiten zugreifen können, es sei denn, sie sind angemeldet.
Der authorized
-Callback wird verwendet, um zu überprüfen, ob eine Anfrage berechtigt ist, auf eine Seite mit Next.js Middleware zuzugreifen. Er wird vor Abschluss einer Anfrage aufgerufen und empfängt ein Objekt mit den Eigenschaften auth
und request
. Die auth
-Eigenschaft enthält die Sitzung des Benutzers, und die request
-Eigenschaft enthält die eingehende Anfrage.
Die providers
-Option ist ein Array, in dem Sie verschiedene Anmeldeoptionen auflisten. Vorerst ist es ein leeres Array, um die NextAuth-Konfiguration zu erfüllen. Sie werden mehr darüber im Abschnitt Credentials Provider hinzufügen erfahren.
Als Nächstes müssen Sie das authConfig
-Objekt in eine Middleware-Datei importieren. Erstellen Sie im Stammverzeichnis Ihres Projekts eine Datei namens middleware.ts
und fügen Sie den folgenden Code ein:
Hier initialisieren Sie NextAuth.js mit dem authConfig
-Objekt und exportieren die auth
-Eigenschaft. Sie verwenden auch die matcher
-Option der Middleware, um anzugeben, dass sie auf bestimmten Pfaden ausgeführt werden soll.
Der Vorteil der Verwendung von Middleware für diese Aufgabe besteht darin, dass die geschützten Routen erst dann mit dem Rendern beginnen, wenn die Middleware die Authentifizierung überprüft hat, was sowohl die Sicherheit als auch die Leistung Ihrer Anwendung verbessert.
Passwort-Hashing
Es ist eine gute Praxis, Passwörter zu hashen, bevor sie in einer Datenbank gespeichert werden. Hashing wandelt ein Passwort in eine Zeichenkette fester Länge um, die zufällig erscheint, und bietet so eine zusätzliche Sicherheitsebene, selbst wenn die Daten des Benutzers offengelegt werden.
Beim Seeden Ihrer Datenbank haben Sie ein Paket namens bcrypt
verwendet, um das Passwort des Benutzers zu hashen, bevor es in der Datenbank gespeichert wurde. Sie werden es erneut später in diesem Kapitel verwenden, um zu überprüfen, ob das vom Benutzer eingegebene Passwort mit dem in der Datenbank übereinstimmt. Sie müssen jedoch eine separate Datei für das bcrypt
-Paket erstellen, da bcrypt
auf Node.js-APIs angewiesen ist, die in der Next.js Middleware nicht verfügbar sind.
Erstellen Sie eine neue Datei namens auth.ts
, die Ihr authConfig
-Objekt erweitert:
Credentials Provider hinzufügen
Als Nächstes müssen Sie die providers
-Option für NextAuth.js hinzufügen. providers
ist ein Array, in dem Sie verschiedene Anmeldeoptionen wie Google oder GitHub auflisten. In diesem Kurs konzentrieren wir uns auf die Verwendung des Credentials Providers.
Der Credentials Provider ermöglicht es Benutzern, sich mit einem Benutzernamen und einem Passwort anzumelden.
Gut zu wissen:
Es gibt andere alternative Provider wie OAuth oder E-Mail. Siehe die NextAuth.js-Dokumentation für eine vollständige Liste der Optionen.
Anmeldefunktionalität hinzufügen
Sie können die authorize
-Funktion verwenden, um die Authentifizierungslogik zu handhaben. Ähnlich wie bei Server Actions können Sie zod
verwenden, um E-Mail und Passwort zu validieren, bevor Sie überprüfen, ob der Benutzer in der Datenbank existiert:
Nach der Validierung der Anmeldeinformationen erstellen Sie eine neue getUser
-Funktion, die den Benutzer aus der Datenbank abfragt.
Rufen Sie dann bcrypt.compare
auf, um zu überprüfen, ob die Passwörter übereinstimmen:
Schließlich geben Sie den Benutzer zurück, wenn die Passwörter übereinstimmen, andernfalls geben Sie null
zurück, um zu verhindern, dass der Benutzer sich anmeldet.
Aktualisierung des Login-Formulars
Jetzt müssen Sie die Authentifizierungslogik mit Ihrem Login-Formular verbinden. Erstellen Sie in Ihrer actions.ts
-Datei eine neue Aktion namens authenticate
. Diese Aktion sollte die signIn
-Funktion aus auth.ts
importieren:
Falls ein 'CredentialsSignin'
-Fehler auftritt, soll eine entsprechende Fehlermeldung angezeigt werden. Weitere Informationen zu NextAuth.js-Fehlern finden Sie in der Dokumentation.
Schließlich können Sie in Ihrer login-form.tsx
-Komponente Reacts useActionState
verwenden, um die Server-Aktion aufzurufen, Formularfehler zu behandeln und den Pending-Status des Formulars anzuzeigen:
Hinzufügen der Logout-Funktionalität
Um die Logout-Funktionalität zu <SideNav />
hinzuzufügen, rufen Sie die signOut
-Funktion aus auth.ts
in Ihrem <form>
-Element auf:
Testen Sie es aus
Testen Sie es jetzt. Sie sollten sich mit folgenden Anmeldedaten in Ihrer Anwendung ein- und ausloggen können:
- E-Mail:
[email protected]
- Passwort:
123456