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/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 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.