Authentifizierung
Authentifizierung überprüft die Identität eines Benutzers, während Autorisierung steuert, auf was ein Benutzer zugreifen kann. Next.js unterstützt mehrere Authentifizierungsmuster, die jeweils für unterschiedliche Anwendungsfälle entwickelt wurden. Diese Seite führt Sie durch jeden Fall, damit Sie basierend auf Ihren Anforderungen die richtige Wahl treffen können.
Authentifizierungsmuster
Der erste Schritt zur Identifizierung des benötigten Authentifizierungsmusters ist das Verständnis der Datenabrufstrategie, die Sie verwenden möchten. Anschließend können wir bestimmen, welche Authentifizierungsanbieter diese Strategie unterstützen. Es gibt zwei Hauptmuster:
- Verwenden Sie statische Generierung, um einen Ladezustand serverseitig zu rendern, gefolgt vom clientseitigen Abruf der Benutzerdaten.
- Holen Sie Benutzerdaten serverseitig ab, um das kurzzeitige Anzeigen nicht authentifizierter Inhalte zu vermeiden.
Authentifizierung statisch generierter Seiten
Next.js erkennt automatisch, dass eine Seite statisch ist, wenn keine blockierenden Datenanforderungen vorhanden sind. Das bedeutet das Fehlen von getServerSideProps
und getInitialProps
auf der Seite. Stattdessen kann Ihre Seite einen Ladezustand vom Server rendern und anschließend den Benutzer clientseitig abrufen.
Ein Vorteil dieses Musters ist, dass Seiten von einem globalen CDN bereitgestellt und mit next/link
vorab geladen werden können. In der Praxis führt dies zu einer schnelleren TTI (Time to Interactive).
Schauen wir uns ein Beispiel für eine Profilseite an. Diese rendert zunächst ein Ladeskelett. Sobald die Anfrage für einen Benutzer abgeschlossen ist, wird der Name des Benutzers angezeigt:
import useUser from '../lib/useUser'
import Layout from '../components/Layout'
const Profile = () => {
// Benutzer clientseitig abrufen
const { user } = useUser({ redirectTo: '/login' })
// Ladezustand serverseitig rendern
if (!user || user.isLoggedIn === false) {
return <Layout>Loading...</Layout>
}
// Sobald die Benutzeranfrage abgeschlossen ist, den Benutzer anzeigen
return (
<Layout>
<h1>Dein Profil</h1>
<pre>{JSON.stringify(user, null, 2)}</pre>
</Layout>
)
}
export default Profile
Sie können dieses Beispiel in Aktion sehen. Schauen Sie sich das with-iron-session
-Beispiel an, um zu verstehen, wie es funktioniert.
Authentifizierung serverseitig gerenderter Seiten
Wenn Sie eine async
-Funktion namens getServerSideProps
von einer Seite exportieren, wird Next.js diese Seite bei jeder Anfrage mit den von getServerSideProps
zurückgegebenen Daten vorrendern.
export async function getServerSideProps(context) {
return {
props: {}, // Wird als Props an die Seitenkomponente übergeben
}
}
Lassen Sie uns das Profilbeispiel so anpassen, dass es serverseitiges Rendering verwendet. Wenn eine Sitzung vorhanden ist, wird user
als Prop an die Profile
-Komponente auf der Seite übergeben. Beachten Sie, dass es in diesem Beispiel kein Ladeskelett gibt.
import withSession from '../lib/session'
import Layout from '../components/Layout'
export const getServerSideProps = withSession(async function ({ req, res }) {
const { user } = req.session
if (!user) {
return {
redirect: {
destination: '/login',
permanent: false,
},
}
}
return {
props: { user },
}
})
const Profile = ({ user }) => {
// Benutzer anzeigen. Kein Ladezustand erforderlich
return (
<Layout>
<h1>Dein Profil</h1>
<pre>{JSON.stringify(user, null, 2)}</pre>
</Layout>
)
}
export default Profile
Ein Vorteil dieses Musters ist die Vermeidung des kurzzeitigen Anzeigens nicht authentifizierter Inhalte vor der Weiterleitung. Es ist wichtig zu beachten, dass das Abrufen von Benutzerdaten in getServerSideProps
das Rendering blockiert, bis die Anfrage an Ihren Authentifizierungsanbieter abgeschlossen ist. Um Engpässe und eine Erhöhung der TTFB (Time to First Byte) zu vermeiden, sollten Sie sicherstellen, dass Ihre Authentifizierungsabfrage schnell ist. Andernfalls sollten Sie statische Generierung in Betracht ziehen.
Authentifizierungsanbieter
Nachdem wir Authentifizierungsmuster besprochen haben, schauen wir uns spezifische Anbieter an und untersuchen, wie sie mit Next.js verwendet werden.
Eigene Datenbank verwenden
Beispiele
Wenn Sie über eine bestehende Datenbank mit Benutzerdaten verfügen, möchten Sie wahrscheinlich eine quelloffene Lösung nutzen, die anbieterunabhängig ist.
- Wenn Sie ein einfaches, verschlüsseltes und zustandsloses Sitzungs-Tool benötigen, verwenden Sie
iron-session
. - Wenn Sie ein vollständiges Authentifizierungssystem mit integrierten Anbietern (Google, Facebook, GitHub…), JWT, JWE, E-Mail/Passwort, Magic Links und mehr benötigen, verwenden Sie
next-auth
.
Beide Bibliotheken unterstützen beide Authentifizierungsmuster. Wenn Sie an Passport interessiert sind, haben wir auch Beispiele dafür mit sicheren und verschlüsselten Cookies:
Andere Anbieter
Um Beispiele mit anderen Authentifizierungsanbietern zu sehen, schauen Sie sich den Beispielordner an.