Was Auth.js v5 anders macht
next-auth@beta ist Auth.js v5 — die große Überarbeitung der bekanntesten Auth-Bibliothek im Next.js-Ökosystem. Der wichtigste Unterschied steht in einem Satz: Statt fünf verschiedener APIs für fünf Kontexte gibt es jetzt eine einzige Funktion — auth() — die überall funktioniert.
Die Kurzfassung: Du konfigurierst Auth.js einmal in einer zentralen
auth.ts und bekommst von dort vier Helfer zurück: auth, handlers, signIn und signOut. Damit deckst du Login, Logout, Session-Lesen und Route-Schutz im kompletten App Router ab.Vorher: fünf APIs für fünf Orte
In NextAuth v4 hing es vom Kontext ab, wie du an die Session kamst — und jede Variante hatte ihre eigenen Tücken:
v4 — verstreut
getServerSession() im Server, getToken() für das rohe JWT, getSession() im Client, withAuth() für die Middleware, useSession() im React-Tree — fünf Wege, fünf Signaturen.v5 — eine Funktion
auth() ersetzt die ersten vier. Nur der reaktive Client-Hook useSession() bleibt — alles andere läuft serverseitig über dieselbe Funktion.So sieht der Kern aus
Eine Datei konfiguriert alles, ein Destructuring gibt dir die vier Werkzeuge:
auth.ts
import NextAuth from "next-auth";
import GitHub from "next-auth/providers/github";
export const { handlers, signIn, signOut, auth } = NextAuth({
providers: [GitHub],
});- auth — die Universal-Funktion: Session lesen, Routen schützen.
- handlers — die
GET/POSTRoute-Handler für den OAuth-Callback. - signIn / signOut — als Server Actions oder programmatisch aufrufbar.
Warum eigentlich? — Warum ein einziges auth() besser ist
Der Kontext, in dem du Code schreibst, sollte nicht bestimmen, wie du an den eingeloggten Nutzer kommst. In v4 musste man wissen: „Bin ich in einem Server Component, einer API-Route oder der Middleware?“ — und je nach Antwort eine andere Funktion mit anderer Signatur importieren. In v5 fragst du in jedem dieser Kontexte dasselbe
await auth() und bekommst überall dasselbe Session-Objekt (oder null) zurück. Weniger zu merken, weniger Fehlerquellen.Häufiger Denkfehler — Ist next-auth@beta instabil?
Das
beta-Tag schreckt ab, ist hier aber irreführend: v5 läuft seit langem produktiv in unzähligen Apps und die Kern-API (auth.ts, auth(), der Route-Handler) ist stabil. beta markiert vor allem, dass einzelne Adapter und Rand-APIs noch finalisiert werden. Pinne die Version in deiner package.json, dann gibt es keine Überraschungen.Tiefer rein — Auth.js vs. NextAuth — der Namens-Salat
Das Projekt heißt heute Auth.js und ist Framework-übergreifend (Next.js, SvelteKit, Express, …). Das npm-Paket für Next.js heißt aber weiterhin
next-auth — die v5 ziehst du dir über das @beta-Tag. Also: Projekt = Auth.js, Paket = next-auth@beta, Version = v5. Drei Namen, eine Sache.