Authentifizierung
Das Verständnis von Authentifizierung ist entscheidend für den Schutz der Daten deiner Anwendung. Diese Seite führt dich durch die React- und Next.js-Funktionen, die für die Implementierung der Authentifizierung verwendet werden.
Bevor du beginnst, hilft es, den Prozess in drei Konzepte zu unterteilen:
- Authentifizierung: Überprüft, ob der Benutzer tatsächlich derjenige ist, der er vorgibt zu sein. Der Benutzer muss seine Identität mit etwas nachweisen, das er besitzt, wie zum Beispiel Benutzername und Passwort.
- Session-Management: Verfolgt den Authentifizierungsstatus des Benutzers über mehrere Anfragen hinweg.
- Autorisierung: Entscheidet, auf welche Routen und Daten der Benutzer zugreifen darf.
Dieses Diagramm zeigt den Authentifizierungsablauf mit React- und Next.js-Funktionen:
Die Beispiele auf dieser Seite behandeln eine grundlegende Authentifizierung mit Benutzername und Passwort zu Bildungszwecken. Während du eine eigene Authentifizierungslösung implementieren kannst, empfehlen wir für mehr Sicherheit und Einfachheit die Verwendung einer Authentifizierungsbibliothek. Diese bieten integrierte Lösungen für Authentifizierung, Session-Management und Autorisierung sowie zusätzliche Funktionen wie Social Logins, Multi-Faktor-Authentifizierung und rollenbasierte Zugangskontrolle. Eine Liste findest du im Abschnitt Auth-Bibliotheken.
Authentifizierung
Hier sind die Schritte zur Implementierung eines Registrierungs- und/oder Anmeldeformulars:
- Der Benutzer übermittelt seine Anmeldedaten über ein Formular.
- Das Formular sendet eine Anfrage, die von einer API-Route verarbeitet wird.
- Nach erfolgreicher Überprüfung wird der Prozess abgeschlossen, was die erfolgreiche Authentifizierung des Benutzers anzeigt.
- Bei fehlgeschlagener Überprüfung wird eine Fehlermeldung angezeigt.
Betrachte ein Anmeldeformular, in dem Benutzer ihre Anmeldedaten eingeben können:
Das obige Formular hat zwei Eingabefelder zum Erfassen der E-Mail-Adresse und des Passworts des Benutzers. Bei der Übermittlung wird eine Funktion ausgelöst, die eine POST-Anfrage an eine API-Route (/api/auth/login
) sendet.
Dann kannst du die API deines Authentifizierungsanbieters in der API-Route aufrufen, um die Authentifizierung zu behandeln:
Session-Management
Session-Management stellt sicher, dass der authentifizierte Status des Benutzers über Anfragen hinweg erhalten bleibt. Es umfasst das Erstellen, Speichern, Aktualisieren und Löschen von Sitzungen oder Tokens.
Es gibt zwei Arten von Sitzungen:
- Zustandslos: Sitzungsdaten (oder ein Token) werden in den Cookies des Browsers gespeichert. Das Cookie wird mit jeder Anfrage gesendet, sodass die Sitzung auf dem Server überprüft werden kann. Diese Methode ist einfacher, kann aber weniger sicher sein, wenn sie nicht korrekt implementiert wird.
- Datenbank: Sitzungsdaten werden in einer Datenbank gespeichert, wobei der Browser des Benutzers nur die verschlüsselte Sitzungs-ID erhält. Diese Methode ist sicherer, kann aber komplex sein und mehr Serverressourcen verbrauchen.
Hinweis: Während du entweder die eine oder die andere Methode oder beide verwenden kannst, empfehlen wir die Verwendung einer Session-Management-Bibliothek wie iron-session oder Jose.
Zustandslose Sitzungen
Cookies setzen und löschen
Du kannst API Routes verwenden, um die Sitzung als Cookie auf dem Server zu setzen:
Datenbank-Sitzungen
Um Datenbank-Sitzungen zu erstellen und zu verwalten, musst du folgende Schritte ausführen:
- Erstelle eine Tabelle in deiner Datenbank zur Speicherung von Sitzungen und Daten (oder prüfe, ob deine Auth-Bibliothek dies übernimmt).
- Implementiere Funktionalität zum Einfügen, Aktualisieren und Löschen von Sitzungen
- Verschlüssele die Sitzungs-ID, bevor du sie im Browser des Benutzers speicherst, und stelle sicher, dass die Datenbank und das Cookie synchron bleiben (dies ist optional, aber empfohlen für optimistische Auth-Prüfungen in Middleware).
Eine Sitzung auf dem Server erstellen:
Autorisierung
Sobald ein Benutzer authentifiziert ist und eine Sitzung erstellt wurde, kannst du Autorisierung implementieren, um zu steuern, worauf der Benutzer in deiner Anwendung zugreifen und was er tun kann.
Es gibt zwei Hauptarten von Autorisierungsprüfungen:
- Optimistisch: Prüft, ob der Benutzer berechtigt ist, auf eine Route zuzugreifen oder eine Aktion auszuführen, anhand der im Cookie gespeicherten Sitzungsdaten. Diese Prüfungen sind nützlich für schnelle Operationen wie das Ein-/Ausblenden von UI-Elementen oder das Umleiten von Benutzern basierend auf Berechtigungen oder Rollen.
- Sicher: Prüft, ob der Benutzer berechtigt ist, auf eine Route zuzugreifen oder eine Aktion auszuführen, anhand der in der Datenbank gespeicherten Sitzungsdaten. Diese Prüfungen sind sicherer und werden für Operationen verwendet, die Zugriff auf sensible Daten oder Aktionen erfordern.
Für beide Fälle empfehlen wir:
- Erstellen eines Data Access Layer, um deine Autorisierungslogik zu zentralisieren
- Verwendung von Data Transfer Objects (DTO), um nur die notwendigen Daten zurückzugeben
- Optional die Verwendung von Middleware für optimistische Prüfungen.
Optimistische Prüfungen mit Middleware (Optional)
Es gibt einige Fälle, in denen du Middleware verwenden und Benutzer basierend auf Berechtigungen umleiten möchtest:
- Für optimistische Prüfungen. Da Middleware auf jeder Route ausgeführt wird, ist sie gut geeignet, um Umleitungslogik zu zentralisieren und nicht autorisierte Benutzer vorzufiltern.
- Zum Schutz statischer Routen, die Daten zwischen Benutzern teilen (z.B. Inhalte hinter einer Bezahlschranke).
Da Middleware jedoch auf jeder Route ausgeführt wird, einschließlich vorgeholter Routen, ist es wichtig, nur die Sitzung aus dem Cookie zu lesen (optimistische Prüfungen) und Datenbankprüfungen zu vermeiden, um Leistungsprobleme zu verhindern.
Zum Beispiel:
Während Middleware für erste Prüfungen nützlich sein kann, sollte sie nicht deine einzige Verteidigungslinie beim Schutz deiner Daten sein. Die Mehrheit der Sicherheitsprüfungen sollte so nah wie möglich an deiner Datenquelle durchgeführt werden, siehe Data Access Layer für weitere Informationen.
Tipps:
- In Middleware kannst du auch Cookies mit
req.cookies.get('session').value
lesen.- Middleware verwendet die Edge Runtime, prüfe ob deine Auth-Bibliothek und Session-Management-Bibliothek kompatibel sind.
- Du kannst die
matcher
-Eigenschaft in der Middleware verwenden, um festzulegen, auf welchen Routen Middleware ausgeführt werden soll. Für Auth wird jedoch empfohlen, dass Middleware auf allen Routen ausgeführt wird.
Erstellen einer Datenzugriffsschicht (DAL)
Schutz von API-Routen
API-Routen in Next.js sind essentiell für die Verarbeitung serverseitiger Logik und Datenverwaltung. Es ist entscheidend, diese Routen abzusichern, damit nur autorisierte Benutzer auf bestimmte Funktionen zugreifen können. Dies beinhaltet typischerweise die Überprüfung des Authentifizierungsstatus des Benutzers und seiner rollenbasierten Berechtigungen.
Hier ist ein Beispiel für die Absicherung einer API-Route:
Dieses Beispiel zeigt eine API-Route mit einer zweistufigen Sicherheitsprüfung für Authentifizierung und Autorisierung. Zunächst wird auf eine aktive Sitzung geprüft und dann verifiziert, ob der angemeldete Benutzer ein 'Admin' ist. Dieser Ansatz gewährleistet einen sicheren Zugriff, der auf authentifizierte und autorisierte Benutzer beschränkt ist, und sorgt für eine robuste Sicherheit bei der Verarbeitung von Anfragen.
Ressourcen
Nachdem du über Authentifizierung in Next.js gelernt hast, hier sind Next.js-kompatible Bibliotheken und Ressourcen, die dir bei der Implementierung sicherer Authentifizierung und Session-Management helfen:
Auth-Bibliotheken
Session-Management-Bibliotheken
Weiterführende Lektüre
Um mehr über Authentifizierung und Sicherheit zu lernen, sieh dir die folgenden Ressourcen an: