Setup: auth.ts, Route-Handler, Env
Vier Dateien, dann läuft Login. Wir installieren das Paket, schreiben die zentrale auth.ts, hängen den Zwei-Zeilen-Route-Handler ein und setzen die AUTH_-Umgebungsvariablen. Beispiel- Provider ist GitHub — jeder andere OAuth-Provider geht genauso.
Mentales Modell:
auth.ts ist die Single Source of Truth. Alles andere — Route-Handler, Middleware, Server Components — importiert nur aus dieser einen Datei. Konfiguration steht nie an zwei Stellen.Schritt für Schritt
- Installieren. Das
@beta-Tag zieht v5. - auth.ts anlegen. Provider rein, vier Helfer raus.
- Route-Handler einhängen. Damit OAuth-Callbacks eine URL haben.
- Env setzen.
AUTH_SECRETplus die Provider-Credentials.
1 · Installieren
Terminal
npm install next-auth@beta # erzeugt direkt ein Secret und schreibt es in .env.local: npx auth secret
2 · Die zentrale Konfiguration
auth.ts (Projekt-Wurzel)
import NextAuth from "next-auth";
import GitHub from "next-auth/providers/github";
export const { handlers, signIn, signOut, auth } = NextAuth({
providers: [GitHub],
});Kein AUTH_GITHUB_ID/AUTH_GITHUB_SECRET im Code — Auth.js liest die passend benannten Env-Variablen automatisch. Mehr dazu unten.
3 · Der Route-Handler
Der OAuth-Flow braucht eine Callback-URL. Auth.js bringt die Logik mit; du exportierst sie nur an die richtige Stelle im App Router:
app/api/auth/[...nextauth]/route.ts
import { handlers } from "@/auth";
export const { GET, POST } = handlers;4 · Umgebungsvariablen
.env.local
AUTH_SECRET=dein-generiertes-secret AUTH_GITHUB_ID=... AUTH_GITHUB_SECRET=...
- AUTH_SECRET
- Pflicht. Signiert/verschlüsselt das Session-JWT. Mit
npx auth secretgeneriert. - AUTH_<PROVIDER>_ID / _SECRET
- Auto-erkannt:
GitHubliestAUTH_GITHUB_IDundAUTH_GITHUB_SECRETvon selbst. - AUTH_URL
- Optional. Wird normalerweise aus den Request-Headern erkannt — nur bei eigenartigen Proxy-Setups manuell nötig.
Warum eigentlich? — Warum die AUTH_-Präfix-Konvention?
In v4 hießen die Variablen
NEXTAUTH_URL und NEXTAUTH_SECRET, und jede Provider-Credential musstest du im Code an den Provider durchreichen. v5 vereinheitlicht das: alles beginnt mit AUTH_, und Provider-Credentials nach dem Schema AUTH_<PROVIDER>_ID/_SECRET werden automatisch eingelesen. Dadurch bleibt auth.ts frei von process.env-Gefummel.Häufiger Denkfehler — Falscher Pfad beim Route-Handler
Der Ordner muss exakt
app/api/auth/[...nextauth]/route.ts heißen — die eckigen Klammern und die drei Punkte (Catch-all-Route) gehören dazu. Tippst du [nextauth] statt [...nextauth], schlägt der OAuth-Callback fehl, weil /api/auth/callback/github nicht matcht. Symptom: Redirect-Loop oder 404 nach dem Provider-Login.Tiefer rein — Was npx auth secret macht
Der Befehl erzeugt einen kryptografisch zufälligen 32-Byte-Wert (base64) und hängt ihn als
AUTH_SECRET an deine .env.local an. Dieser Wert ist der Schlüssel, mit dem das Session-JWT signiert (und bei verschlüsselten Sessions zusätzlich verschlüsselt) wird. Ändert sich das Secret, werden alle bestehenden Sessions ungültig — in Produktion also fix setzen und nicht rotieren, ohne es zu wollen.