SDK

SDK Next.js

@authon/nextjsIntegração full-stack com Next.js com middleware de rota, auxiliares de Componente de Servidor e o SDK React completo.

npm: @authon/nextjsNext.js 14+App Router

Instalação

bash
npm install @authon/nextjs

Variáveis de Ambiente

Adicione suas chaves de API do Authon ao .env.local. A chave publicável é segura para expor ao navegador; mantenha a chave secreta apenas no lado do servidor.

.env.local
NEXT_PUBLIC_AUTHON_PUBLISHABLE_KEY=pk_live_your_publishable_key
AUTHON_SECRET_KEY=sk_live_your_secret_key

AuthonProvider no Layout

AdicioneAuthonProvider ao seu layout raiz para que todos os Componentes Client tenham acesso ao contexto de autenticação.

app/layout.tsx
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

UseauthonMiddleware para proteger rotas na borda. Requisições não autenticadas para rotas não públicas são automaticamente redirecionadas para sua página de login.

middleware.ts
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$).*)"],
};

Componentes de Servidor

Acesse dados de autenticação em Componentes de Servidor e Server Actions usando os auxiliares de servidor de @authon/nextjs/server.

auth()

Retorna metadados de sessão incluindo o ID do usuário e um getter de token. Leve — não busca o objeto completo do usuário.

app/api/orders/route.ts
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()

Busca e retorna o objeto completo AuthonUser . Use isso quando precisar de dados do perfil do usuário em um Componente de Servidor.

app/dashboard/page.tsx
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>
  );
}

Hooks e Componentes Client

Todos os hooks e componentes do SDK React funcionam em Componentes Client. Importe de @authon/nextjs(re-exporta tudo de@authon/react).

components/Header.tsx
"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>
  );
}

Proteção de Rotas de API

Proteja rotas de API verificando a sessão viaauth():

app/api/profile/route.ts
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 });
}

Páginas de Login / Cadastro

Crie páginas dedicadas de login e cadastro usando os componentes de modal embutidos:

app/sign-in/page.tsx
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>
  );
}
app/sign-up/page.tsx
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>
  );
}
Authon — Plataforma universal de autenticação