Next.js OAuth-Login in der Praxis: Google, GitHub und WeChat Schritt für Schritt

Letzte Woche ein Community-Projekt: Der Product Manager sagte: „Füg mal Google-Login hinzu, sollte schnell gehen.“ Dachte ich – Third-Party-Login, ein paar Tutorials gelesen, kein Problem. Stattdessen ein ganzer Nachmittag: redirect_uri-Fehler, Token-Abruf schlägt fehl, rote Meldungen in der Konsole – eine nach der anderen. Am frustrierendsten: Schritt für Schritt die offizielle Doku befolgt, und es lief trotzdem nicht.
Später wurde klar: Das Problem lag nicht im Code, sondern im zu flachen Verständnis des OAuth-Flows. Authorization Code, Access Token, Callback – einzeln verständlich, zusammen verwirrend.
In diesem Artikel erkläre ich OAuth in einfachen Worten – nicht als abstrakte RFC-Beschreibung, sondern mit der Analogie „Paket für jemand anderen abholen“. Sie verstehen, warum Code und Token getrennt sind, was der Callback macht und wo Konfigurationen typischerweise scheitern. Danach richten wir drei Logins ein: Google (internationaler Standard), GitHub (entwicklerfreundlich) und WeChat (im Inland unverzichtbar, aber aufwendig).
Ehrlich gesagt ist WeChat-Login der größte Brocken: wenig hilfreiche Doku, Unternehmensnachweis nötig, lokales Debugging mühsam. Weil man an Inlandsprojekten kaum vorbeikommt, dokumentiere ich die Stolpersteine – inklusive Tunnel für lokale Tests und Custom Provider. Nach dem Lesen sollten Sie mit einer Architektur Login-Anforderungen im In- und Ausland abdecken können.
Was OAuth eigentlich macht
OAuth mit der Paket-Abhol-Analogie
Beim ersten OAuth-Kontakt wirkten Authorization Code und Access Token überwältigend. Die Idee ist simpel: jemand holt ein Paket für Sie ab.
Stellen Sie sich vor: In der Post liegt Ihr Paket (Nutzerdaten), Sie sind im Büro und können nicht selbst hin. Ein Freund (Ihre Next.js-App) bietet an, abzuholen. Die Post gibt nichts an Unbekannte – es braucht Ihre Erlaubnis. Der Ablauf:
1. Sie geben dem Freund einen Abholcode – das ist der authorization code. Nach Klick auf „Mit Google anmelden“ landen Sie auf Googles Seite; nach Zustimmung sendet Google einen temporären code per URL-Parameter an Ihre App.
2. Der Freund geht mit dem Code zur Post – Ihr Backend tauscht den Code gegen einen access token. Die Post prüft, ob der Freund wirklich vertrauenswürdig ist – dafür haben Sie vorher eine „Ausweisnummer“ hinterlegt (client_secret).
3. Nach Prüfung gibt es das Paket – Code und Ausweis stimmen, die Post übergibt das Paket (Nutzerdaten) an den Freund, der es Ihnen weitergibt. Das ist der Abruf mit access_token.
Der Punkt: Der Abholcode ist einmalig und allein wertlos – ohne Ausweis (secret) gibt die Post nichts heraus. Deshalb darf der Code in der Browser-URL stehen, das Secret aber nur im Backend.
Die vier Schritte im Detail
Technisch sieht es so aus:
Schritt 1: Weiterleitung zur OAuth-Autorisierungsseite
Der Nutzer klickt „Mit Google anmelden“, das Frontend leitet zu Google weiter:
https://accounts.google.com/o/oauth2/v2/auth?
client_id=Ihre_App-ID
&redirect_uri=http://localhost:3000/api/auth/callback/google
&response_type=code
&scope=email profile
Wichtige Parameter:
client_id: Ihre App-ID bei Googleredirect_uri: wohin Google nach der Autorisierung zurückschicktscope: welche Nutzerdaten Sie anfordern
Schritt 2: Zustimmung und Code
Nach „Zulassen“ leitet Google zurück, die URL sieht etwa so aus:
http://localhost:3000/api/auth/callback/google?code=4/0AfJohXl...&state=random123
Der code ist der Abholcode – kurze Gültigkeit (oft 5–10 Minuten), einmalige Verwendung.
Schritt 3: Backend tauscht Code gegen access_token
Nur das Backend (nicht das Frontend) sendet Code plus client_secret an Google:
const response = await fetch('https://oauth2.googleapis.com/token', {
method: 'POST',
body: JSON.stringify({
code: 'der_erhaltene_code',
client_id: 'your_client_id',
client_secret: 'your_secret', // niemals ans Frontend
redirect_uri: 'http://localhost:3000/api/auth/callback/google',
grant_type: 'authorization_code'
})
})
const { access_token } = await response.json()
Der access_token ist der Schlüssel zu Nutzerdaten.
Schritt 4: Nutzerprofil abrufen
Mit dem Token rufen Sie die Google-API auf:
const userInfo = await fetch('https://www.googleapis.com/oauth2/v2/userinfo', {
headers: {
Authorization: `Bearer ${access_token}`
}
})
const user = await userInfo.json()
// { email: "[email protected]", name: "Max", picture: "Avatar-URL" }
Danach legen oder aktualisieren Sie den Nutzer in Ihrer Datenbank, erzeugen eine Session – Login fertig.
Begriffe auf einen Blick
| Begriff | Kurz erklärt | Wo sichtbar |
|---|---|---|
| Client ID | Öffentliche App-ID | .env.local, URL-Parameter |
| Client Secret | Geheimes Passwort der App | nur Backend / Env |
| Authorization Code | Einmaliger Abholcode | code in der Callback-URL |
| Access Token | Schlüssel zu Nutzerdaten | Backend, nicht ans Frontend |
| Redirect URI | Rücksprung-Adresse nach Autorisierung | OAuth-Konsole, Auth-URL |
| Scope | angeforderte Berechtigungen | z. B. email profile |
| State | Zufallsstring gegen CSRF | Auth-URL und Callback |
State: Beim Start erzeugen Sie einen Zufallswert (z. B. abc123), speichern ihn in der Session und senden ihn mit. Beim Callback muss derselbe Wert zurückkommen – sonst Abbruch. NextAuth.js erledigt das automatisch.
Warum nicht direkt ein Token in der URL?
Sicherheit.
Die Browser-URL ist lesbar – Verlauf, Server-Logs, Extensions. Ein Token dort wäre ein offener Schlüssel zu Nutzerdaten.
Ein abgefangener Code hilft dem Angreifer wenig:
- Code ist einmalig
- Tausch erfordert client_secret (nur Backend)
- redirect_uri muss passen
Das ist der Authorization Code Flow – sicherste Variante von OAuth 2.0 für Web-Apps mit Backend. Der veraltete Implicit Flow liefert Token direkt in der URL und gilt als unsicher.
NextAuth.js schnell einrichten
Warum NextAuth.js
In Next.js gibt es mehrere Wege – selbst implementieren oder eine Bibliothek. Selbst gebaut: viele Fallstricke; ich bin zu NextAuth.js gewechselt.
Grund 1: etabliert
Offiziell in der Next.js-Doku empfohlen, große Community, v5 unterstützt App Router und Server Components.
Grund 2: 30+ Provider
Google, GitHub, Facebook, Twitter fast plug-and-play. Für WeChat ohne Built-in: Custom Provider, ohne OAuth von Null.
Grund 3: Komplexität ausgelagert
Sessions, JWT-Signatur, DB-Speicher, CSRF – automatisch. Sie konzentrieren sich auf Business-Logik (z. B. Willkommens-Mail beim ersten Login).
Kernkonfiguration
Zentrale API-Route im App Router:
app/api/auth/[...nextauth]/route.ts
[...nextauth] ist ein Catch-all für /api/auth/*, u. a.:
/api/auth/signin– Anmeldeseite/api/auth/callback/google– Google-Callback/api/auth/signout– Abmelden/api/auth/session– aktuelle Session
Basis:
// app/api/auth/[...nextauth]/route.ts
import NextAuth from "next-auth"
import GoogleProvider from "next-auth/providers/google"
import GitHubProvider from "next-auth/providers/github"
export const authOptions = {
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
}),
GitHubProvider({
clientId: process.env.GITHUB_ID!,
clientSecret: process.env.GITHUB_SECRET!,
}),
],
pages: {
signIn: '/login',
},
callbacks: {
async signIn({ user, account, profile }) {
return true // false blockiert Login
},
async session({ session, token }) {
session.user.id = token.sub
return session
},
},
}
const handler = NextAuth(authOptions)
export { handler as GET, handler as POST }
export { handler as GET, handler as POST } ist im App Router Pflicht.
Umgebungsvariablen
Pflicht (Beispiel .env.local):
# NextAuth
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your-secret-key-here
# v5 alternativ
AUTH_SECRET=your-secret-key-here
# Google
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
# v5: AUTH_GOOGLE_ID / AUTH_GOOGLE_SECRET
# GitHub
GITHUB_ID=your-github-client-id
GITHUB_SECRET=your-github-client-secret
# v5: AUTH_GITHUB_ID / AUTH_GITHUB_SECRET
Hinweise:
-
NEXTAUTH_URL: vollständige App-URL – lokal
http://localhost:3000, Produktion mithttps. -
NEXTAUTH_SECRET / AUTH_SECRET: JWT-Signatur, zufällig erzeugen:
openssl rand -base64 32
Nicht committen; bei Leak sofort rotieren.
- AUTH_-Präfix (v5):
AUTH_PROVIDER_IDundAUTH_PROVIDER_SECRETwerden automatisch erkannt.
Installation – Minimalsetup
Schritt 1: Installieren
npm install next-auth
# oder
pnpm add next-auth
Schritt 2: app/api/auth/[...nextauth]/route.ts anlegen (Code oben).
Schritt 3: .env.local
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=<Ausgabe von openssl rand -base64 32>
Schritt 4: Login-Buttons
// app/login/page.tsx
'use client'
import { signIn } from 'next-auth/react'
export default function LoginPage() {
return (
<div>
<button onClick={() => signIn('google')}>
Mit Google anmelden
</button>
<button onClick={() => signIn('github')}>
Mit GitHub anmelden
</button>
</div>
)
}
Schritt 5: SessionProvider
// app/layout.tsx
import { SessionProvider } from 'next-auth/react'
export default function RootLayout({ children }) {
return (
<html>
<body>
<SessionProvider>
{children}
</SessionProvider>
</body>
</html>
)
}
Ohne OAuth-Apps bei Google/GitHub schlagen Klicks noch fehl – das folgt unten.
Google-Login einrichten
Google Cloud Console
Zwei Teile: OAuth-App in der Console, Anbindung in Next.js.
Schritt 1: https://console.cloud.google.com – ggf. neues Projekt, z. B. „Mein Blog“.
Schritt 2: „APIs & Services“ → „Library“, „Google+ API“ suchen und aktivieren (historischer Name, OAuth nutzt ihn noch).
Schritt 3: „Credentials“ → „Create Credentials“ → „OAuth client ID“. Beim ersten Mal: OAuth consent screen (Name, Support-E-Mail). Application type: Web application.
Schritt 4: Redirect URIs (kritisch)
Authorized redirect URIs, z. B.:
Entwicklung:
http://localhost:3000/api/auth/callback/google
Produktion (nach Deploy):
https://yourdomain.com/api/auth/callback/google
Details:
httplokal, Produktion nurhttps- Port muss stimmen (
3001→localhost:3001) - Pfad exakt
/api/auth/callback/google - keine Query-Parameter in der Konfiguration
Nach „Create“ Client ID und Secret kopieren.
Schritt 5: .env.local
GOOGLE_CLIENT_ID=Ihre_Client_ID.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxx
Next.js-Integration
Optional erweitern:
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
authorization: {
params: {
prompt: "consent",
access_type: "offline",
response_type: "code"
}
}
}),
prompt: "consent": jedes Mal Consent-Screen (gut zum Testen)access_type: "offline": Refresh Tokenresponse_type: "code": Authorization Code Flow
Testen
npm run dev
http://localhost:3000/login → „Mit Google anmelden“ → nach Zustimmung Redirect zurück.
Server:
import { getServerSession } from "next-auth"
import { authOptions } from "./api/auth/[...nextauth]/route"
export default async function Home() {
const session = await getServerSession(authOptions)
if (session) {
return <div>Hallo, {session.user?.name}</div>
}
return <div>Nicht angemeldet</div>
}
Client:
'use client'
import { useSession } from "next-auth/react"
export default function Profile() {
const { data: session, status } = useSession()
if (status === "loading") return <div>Laden…</div>
if (!session) return <div>Nicht angemeldet</div>
return (
<div>
<img src={session.user?.image} alt="Avatar" />
<p>{session.user?.name}</p>
<p>{session.user?.email}</p>
</div>
)
}
Typische Fehler
Fehler 1: redirect_uri_mismatch
Error 400: redirect_uri_mismatch
Die URI in der Console muss exakt der im Request entsprechen.
Vorgehen: DevTools → Network → Login-Klick → redirect_uri in der Google-URL kopieren → 1:1 in Authorized redirect URIs eintragen (Protokoll, Port, Pfad, keine Extra-Slashes).
Fehler 2: Access blocked: This app’s request is invalid
OAuth consent screen fehlt oder Testnutzer nicht gesetzt → „OAuth consent screen“ konfigurieren, bei External unveröffentlicht Testnutzer-E-Mail hinzufügen.
Fehler 3: Port
App auf 3001, URI nur 3000 → Port angleichen oder mehrere URIs eintragen.
Fehler 4: HTTPS in Produktion
Google verlangt HTTPS in Produktion – Vercel/Netlify liefern das mit.
GitHub-Login
GitHub OAuth App
Einfacher als Google – keine separate API-Aktivierung.
Schritt 1: GitHub → Avatar → Settings → Developer settings → OAuth Apps → New OAuth App.
Schritt 2:
- Application name: beliebig
- Homepage URL:
http://localhost:3000(Produktion: Ihre Domain) - Authorization callback URL:
http://localhost:3000/api/auth/callback/github
GitHub ist bei Callback-URLs etwas flexibler als Google.
Client ID notieren, „Generate a new client secret“ (einmal sichtbar).
Schritt 3: .env.local
GITHUB_ID=Ihre_Client_ID
GITHUB_SECRET=Ihr_Client_Secret
Next.js
GitHubProvider({
clientId: process.env.GITHUB_ID!,
clientSecret: process.env.GITHUB_SECRET!,
}),
Google vs. GitHub
| Aspekt | GitHub | |
|---|---|---|
| Aufwand | mittel, API aktivieren | gering |
| Redirect URI | strikt exakt | flexibler |
| HTTPS | Produktion Pflicht | localhost http ok |
| Scope | explizit | oft Standard reicht |
| Profil | email, name, picture | login, email, avatar_url |
GitHub-E-Mail kann null sein (Privatsphäre). Im Code absichern:
const userEmail = session.user?.email || 'E-Mail nicht angegeben'
WeChat-Login (Inlands-Szenario)
Drei WeChat-Varianten
| Variante | Einsatz | Voraussetzung | UX |
|---|---|---|---|
| Open Platform – Web | eigenständige Website | Unternehmen, ICP-Domain, HTTPS | QR-Login, PC |
| Official Account – Web | H5 in WeChat | verifizierter Account | nur WeChat-Browser |
| WeCom | intern | WeCom-Account | nur Mitarbeiter |
Hier: Open Platform Web-Login für eine standalone Next.js-Site.
Open Platform (hohe Hürde)
Voraussetzungen: Gewerbeanmeldung, ICP-Domain, HTTPS.
Schritt 1: https://open.weixin.qq.com – „Website Application Developer“, Gewerbeschein, Prüfung (1–2 Werktage).
Schritt 2: Website-App anlegen – Name, Beschreibung, Domain (ICP). Authorized callback domain: nur Domain, z. B. yourdomain.com (ohne Protokoll/Pfad).
Prüfung 1–7 Tage, dann AppID und AppSecret.
Schritt 3:
WECHAT_APP_ID=Ihre_AppID
WECHAT_APP_SECRET=Ihr_AppSecret
Custom Provider in NextAuth.js
const WeChatProvider = {
id: "wechat",
name: "WeChat",
type: "oauth",
authorization: {
url: "https://open.weixin.qq.com/connect/qrconnect",
params: {
appid: process.env.WECHAT_APP_ID,
scope: "snsapi_login",
response_type: "code",
},
},
token: {
url: "https://api.weixin.qq.com/sns/oauth2/access_token",
async request({ params, provider }) {
const response = await fetch(
`https://api.weixin.qq.com/sns/oauth2/access_token?appid=${process.env.WECHAT_APP_ID}&secret=${process.env.WECHAT_APP_SECRET}&code=${params.code}&grant_type=authorization_code`
)
const tokens = await response.json()
return { tokens }
},
},
userinfo: {
url: "https://api.weixin.qq.com/sns/userinfo",
async request({ tokens }) {
const response = await fetch(
`https://api.weixin.qq.com/sns/userinfo?access_token=${tokens.access_token}&openid=${tokens.openid}`
)
return await response.json()
},
},
profile(profile) {
return {
id: profile.unionid || profile.openid,
name: profile.nickname,
email: null,
image: profile.headimgurl,
}
},
}
export const authOptions = {
providers: [WeChatProvider, /* … */],
}
Lokales Debugging
WeChat verlangt HTTPS und registrierte Domain.
Option 1: Tunnel (empfohlen)
ngrok http 3000
# oder cpolar (Inland oft stabiler)
cpolar http 3000
Temporäre URL z. B. https://abc123.ngrok.io als Callback-Domain in der Open Platform.
Option 2: Sandbox
https://mp.weixin.qq.com/debug/cgi-bin/sandbox – Test-AppID/Secret, mit Tunnel-Domain. Nur für eigene Tests.
Besonderheiten WeChat
openid vs. unionid: openid pro App; unionid über Apps einer Open-Platform-ID – für eindeutige Nutzer-ID unionid bevorzugen, sonst openid.
Keine E-Mail: email bleibt null – ggf. nachträglich abfragen.
Kurze Token-Lebensdauer: ca. 2 Stunden, begrenzte Refreshes – Refresh-Logik planen.
Zusammenfassung
Vom OAuth-Prinzip bis Google, GitHub und WeChat – ein durchgängiger Third-Party-Login-Weg.
Kernpunkte:
- Code und Token getrennt aus Sicherheitsgründen; Secret nur im Backend
- NextAuth.js übernimmt Session, CSRF und mehr
- Google: strikte redirect URIs; GitHub: einfacher; WeChat: höchste Hürde, im Inland oft nötig
- WeChat: Unternehmen + ICP; lokal Tunnel + Sandbox
Praxis:
openssl rand -base64 32für NEXTAUTH_SECRET- Mehrere Ports in Google Console eintragen
- GitHub-E-Mail kann fehlen
- unionid für appübergreifende Identität
Schwierig ist oft nicht der Code, sondern OAuth-Design und Plattform-Unterschiede. Wenn Sie beim nächsten „Google-Login einbauen“ weniger Stunden in der Konsole verbringen – Ziel erreicht.
Next.js OAuth-Login: vollständiger Konfigurationsablauf
Vom OAuth-Verständnis bis zur Einrichtung von Google-, GitHub- und WeChat-Login
⏱️ Estimated time: 2 hr
- 1
Step 1: OAuth-Flow verstehen (Paket-Abhol-Analogie)
Kernidee: Passwort nicht an Dritt-Apps geben, nur temporäre Berechtigung beim OAuth-Anbieter.
Analogie:
• Sie (Nutzer) → wollen sich anmelden
• Freund (Next.js-App) → holt Paket ab
• Post (OAuth-Anbieter) → Google, GitHub, WeChat
• Zugangskarte (Passwort) → nicht weitergeben
• Tagespass (access_token) → begrenzt gültig
Vier Schritte:
1. Abholcode (authorization code)
2. Code + client_secret → access_token
3. Nutzerdaten vom Anbieter
4. Session in Ihrer App
Wichtig: Code einmalig und kurzlebig; client_secret nur serverseitig; access_token zeitlich und in Rechten begrenzt - 2
Step 2: Google-Login konfigurieren
1. Google Cloud Console:
• https://console.cloud.google.com
• Projekt → APIs & Services → Credentials → OAuth-Client-ID (Web)
• Redirect: http://localhost:3000/api/auth/callback/google
2. client_id und client_secret kopieren
3. NextAuth.js:
```ts
import NextAuth from 'next-auth'
import GoogleProvider from 'next-auth/providers/google'
export const authOptions = {
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
})
],
}
const handler = NextAuth(authOptions)
export { handler as GET, handler as POST }
```
4. Env:
```
GOOGLE_CLIENT_ID=…
GOOGLE_CLIENT_SECRET=…
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=…
```
5. UI: signIn('google') - 3
Step 3: GitHub-Login konfigurieren
1. GitHub → Settings → Developer settings → OAuth Apps → New
• Callback: http://localhost:3000/api/auth/callback/github
2. Client ID und Secret
3. NextAuth.js GitHubProvider + GITHUB_ID / GITHUB_SECRET
Ablauf analog zu Google, anderer Anbieter - 4
Step 4: WeChat-Login (Sonderfälle)
1. https://open.weixin.qq.com – Website-App, AppID/AppSecret, Unternehmensnachweis
2. Callback-Domain: yourdomain.com (ohne http/https)
3. Custom Provider (siehe Artikel)
4. Lokal: ngrok/cpolar, Callback und NEXTAUTH_URL auf Tunnel-URL
Hinweise: Unternehmensnachweis, ICP, unionid bevorzugen - 5
Step 5: Häufige Fehler beheben
redirect_uri_mismatch: URI in der Konsole exakt wie im Request; lokal und Produktion eintragen
Fehlende Env: .env.local prüfen, Namen, Vercel Dashboard
Produktion scheitert, lokal ok: Produktions-redirect_uri mit https hinzufügen
Sicherheit: client_secret nur Backend; State gegen CSRF; NextAuth.js prüft State
FAQ
Wie funktioniert der OAuth-Flow?
1. Abholcode (authorization code) nach Klick auf „Mit Google anmelden“ und Zustimmung
2. Backend tauscht code + client_secret gegen access_token
3. Mit Token Nutzerprofil vom Anbieter
4. Session in Ihrer App
Code einmalig und kurzlebig; client_secret nur serverseitig; access_token begrenzt gültig. Sie geben kein Passwort an Dritt-Apps.
Was bedeutet redirect_uri_mismatch?
Lösung: Exakt dieselbe URI eintragen – lokal http://localhost:3000/api/auth/callback/google, Produktion https://yourdomain.com/api/auth/callback/google. Beide Umgebungen separat konfigurieren. Typisch: Tippfehler, falscher Slash, http vs. https. NextAuth-Pfad: /api/auth/callback/[provider]. Änderungen können Minuten brauchen.
Warum ist WeChat-Login besonders aufwendig?
Wie richtet man einen Custom Provider ein?
Unterschied unionid und openid?
WeChat lokal debuggen?
10 Min. Lesezeit · Veröffentlicht am: 19. Dez. 2025 · Aktualisiert am: 14. Juli 2026
Next.js Komplettleitfaden
Wenn du über die Suche hier gelandet bist, kommst du am schnellsten weiter, indem du zum vorherigen oder nächsten Beitrag dieser Serie springst.
Vorheriger
Next.js OAuth-Anmeldung: Google, GitHub, WeChat – Konfiguration und Best Practices
OAuth 2.0 verständlich erklärt: Schritt-für-Schritt-Konfiguration von Google-, GitHub- und WeChat-Login in Next.js – inklusive Lösungen für Callback-Fehler und Sicherheitsfallen.
Teil 13 von 51
Nächster
Next.js Internationalisierung – Vollständiger Leitfaden: next-intl Best Practices
Ausführliche Anleitung zur Internationalisierung mit Next.js App Router – next-intl-Konfiguration, mehrsprachiges Routing und Best Practices für Übersetzungsdateien, inklusive praktischer Codebeispiele
Teil 15 von 51
Ähnliche Beiträge
Next.js App Router Einstieg: Kernkonzepte und Grundlagen im Überblick

Next.js App Router Einstieg: Kernkonzepte und Grundlagen im Überblick
Next.js 15 in der Praxis: Wie ich an einem Wochenende ein produktionsreifes Blog-System aufgebaut habe


Kommentare
Melde dich mit GitHub an, um einen Kommentar zu hinterlassen