Next.js SDK
@authon/nextjs — Full-Stack Next.js-Integration mit Routen-Middleware, Server-Komponenten-Helfern und dem vollständigen React SDK.
Installation
npm install @authon/nextjsUmgebungsvariablen
Fügen Sie Ihre Authon API-Schlüssel zu .env.local. hinzu. Der öffentliche Schlüssel darf dem Browser zugänglich gemacht werden; halten Sie den geheimen Schlüssel nur serverseitig.
NEXT_PUBLIC_AUTHON_PUBLISHABLE_KEY=pk_live_your_publishable_key
AUTHON_SECRET_KEY=sk_live_your_secret_keyAuthonProvider im Layout
Fügen SieAuthonProvider zu Ihrem Root-Layout hinzu, damit alle Client-Komponenten Zugriff auf den Auth-Kontext haben.
import type { Metadata } from "next";
import { AuthonProvider } from "@authon/nextjs";
export const metadata: Metadata = {
title: "My App",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>
<AuthonProvider
publishableKey={process.env.NEXT_PUBLIC_AUTHON_PUBLISHABLE_KEY!}
>
{children}
</AuthonProvider>
</body>
</html>
);
}Middleware
Verwenden SieauthonMiddleware um Routen am Edge zu schützen. Nicht authentifizierte Anfragen an nicht-öffentliche Routen werden automatisch zu Ihrer Anmeldeseite weitergeleitet.
import { authonMiddleware } from "@authon/nextjs";
export default authonMiddleware({
// Routes that do NOT require authentication
publicRoutes: ["/", "/about", "/pricing", "/sign-in", "/sign-up"],
// Where to redirect unauthenticated users (default: /sign-in)
signInUrl: "/sign-in",
});
export const config = {
// Apply middleware to all routes except Next.js internals and static files
matcher: ["/((?!_next/static|_next/image|favicon.ico|.*\.png$).*)"],
};Server-Komponenten
Greifen Sie auf Authentifizierungsdaten in Server-Komponenten und Server-Aktionen über die Server-Helfer von @authon/nextjs/server.
auth()
Gibt Sitzungsmetadaten zurück, einschließlich der Benutzer-ID und eines Token-Getters. Leichtgewichtig — ruft nicht das vollständige Benutzerobjekt ab.
import { auth } from "@authon/nextjs/server";
import { NextResponse } from "next/server";
export async function GET() {
const { userId, getToken } = await auth();
if (!userId) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const token = getToken();
// Use token to call external APIs on behalf of the user
const orders = await fetchOrders(userId, token);
return NextResponse.json({ orders });
}currentUser()
Ruft das vollständige AuthonUser Objekt ab und gibt es zurück. Verwenden Sie dies, wenn Sie Benutzerprofildaten in einer Server-Komponente benötigen.
import { currentUser } from "@authon/nextjs/server";
import { redirect } from "next/navigation";
export default async function DashboardPage() {
const user = await currentUser();
// Redirect if not signed in
if (!user) {
redirect("/sign-in");
}
return (
<main>
<h1>Welcome back, {user.displayName ?? user.email}!</h1>
<p>Account created: {new Date(user.createdAt).toLocaleDateString()}</p>
<p>Sign-in count: {user.signInCount}</p>
</main>
);
}Client-Hooks & Komponenten
Alle React SDK-Hooks und Komponenten funktionieren in Client-Komponenten. Importieren Sie von @authon/nextjs(re-exportiert alles von@authon/react).
"use client";
import Link from "next/link";
import { SignedIn, SignedOut, UserButton, useAuthon } from "@authon/nextjs";
export function Header() {
const { openSignIn } = useAuthon();
return (
<header className="flex items-center justify-between p-4 border-b">
<Link href="/">My App</Link>
<div className="flex items-center gap-3">
<SignedIn>
<Link href="/dashboard">Dashboard</Link>
<UserButton />
</SignedIn>
<SignedOut>
<button onClick={() => openSignIn()} className="btn-primary">
Sign in
</button>
</SignedOut>
</div>
</header>
);
}API-Routen-Schutz
Schützen Sie API-Routen, indem Sie die Sitzung überauth():
import { auth } from "@authon/nextjs/server";
import { currentUser } from "@authon/nextjs/server";
import { NextResponse } from "next/server";
export async function GET() {
const { userId } = await auth();
if (!userId) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const user = await currentUser();
return NextResponse.json({ user });
}
export async function PATCH(request: Request) {
const { userId } = await auth();
if (!userId) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const body = await request.json();
// Update user profile...
return NextResponse.json({ success: true });
}Anmelde- / Registrierungsseiten
Erstellen Sie dedizierte Anmelde- und Registrierungsseiten mit den eingebetteten Modal-Komponenten:
import { SignIn } from "@authon/nextjs";
export default function SignInPage() {
return (
<div className="flex min-h-screen items-center justify-center bg-slate-950">
<SignIn mode="embedded" />
</div>
);
}import { SignUp } from "@authon/nextjs";
export default function SignUpPage() {
return (
<div className="flex min-h-screen items-center justify-center bg-slate-950">
<SignUp mode="embedded" />
</div>
);
}