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 Funktionauth() — 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/POST Route-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 DenkfehlerIst 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 reinAuth.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.