Next.js SDK
Integracion completa de Auris para Next.js con soporte para App Router y Pages Router.
Instalacion
npm install @auris/nextjs
# o
yarn add @auris/nextjs
# o
pnpm add @auris/nextjsConfiguracion
Variables de entorno
Agrega las siguientes variables a tu archivo .env.local:
NEXT_PUBLIC_AURIS_PUBLISHABLE_KEY=pk_live_xxxxx
AURIS_API_KEY=sk_live_xxxxx
NEXT_PUBLIC_AURIS_API_URL=https://api.aurisid.comProvider (App Router)
Envuelve tu aplicacion con AurisProvider:
// app/layout.tsx
import { AurisProvider } from '@auris/nextjs';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="es">
<body>
<AurisProvider>
{children}
</AurisProvider>
</body>
</html>
);
}Provider (Pages Router)
// pages/_app.tsx
import { AurisProvider } from '@auris/nextjs';
import type { AppProps } from 'next/app';
export default function App({ Component, pageProps }: AppProps) {
return (
<AurisProvider>
<Component {...pageProps} />
</AurisProvider>
);
}Middleware
Protege tus rutas con el middleware de autenticacion:
// middleware.ts
import { authMiddleware } from '@auris/nextjs/server';
export default authMiddleware({
// Rutas accesibles sin autenticacion
publicRoutes: [
'/',
'/sign-in',
'/sign-up',
'/forgot-password',
'/api/webhooks/(.*)',
],
// Rutas que siempre ignoran autenticacion
ignoredRoutes: [
'/api/health',
'/_next/(.*)',
'/favicon.ico',
],
// URL de redireccion al login
signInUrl: '/sign-in',
// URL despues de login exitoso
afterSignInUrl: '/dashboard',
});
export const config = {
matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'],
};Componentes de UI
SignIn
Componente de inicio de sesion pre-construido:
import { SignIn } from '@auris/nextjs';
export default function SignInPage() {
return (
<SignIn
appearance={{
variables: {
colorPrimary: '#4f46e5',
},
}}
redirectUrl="/dashboard"
/>
);
}SignUp
Componente de registro:
import { SignUp } from '@auris/nextjs';
export default function SignUpPage() {
return (
<SignUp
appearance={{
variables: {
colorPrimary: '#4f46e5',
},
}}
redirectUrl="/dashboard"
/>
);
}UserButton
Menu de usuario con avatar y opciones:
import { UserButton } from '@auris/nextjs';
export default function Header() {
return (
<header>
<nav>
{/* ... */}
<UserButton
afterSignOutUrl="/"
showName={true}
/>
</nav>
</header>
);
}Hooks
useAuth
Hook principal para acceder al estado de autenticacion:
'use client';
import { useAuth } from '@auris/nextjs';
export function ProfilePage() {
const { user, isLoaded, isSignedIn, signOut } = useAuth();
if (!isLoaded) {
return <div>Cargando...</div>;
}
if (!isSignedIn) {
return <div>No autenticado</div>;
}
return (
<div>
<h1>Hola, {user.firstName}!</h1>
<p>Email: {user.email}</p>
<button onClick={() => signOut()}>
Cerrar sesion
</button>
</div>
);
}useUser
Acceso directo al usuario actual:
'use client';
import { useUser } from '@auris/nextjs';
export function UserInfo() {
const { user, isLoaded } = useUser();
if (!isLoaded || !user) return null;
return (
<div>
<img src={user.avatarUrl} alt={user.firstName} />
<span>{user.email}</span>
</div>
);
}useOrganization
Acceso a la organizacion activa:
'use client';
import { useOrganization } from '@auris/nextjs';
export function OrgInfo() {
const { organization, membership, isLoaded } = useOrganization();
if (!isLoaded || !organization) return null;
return (
<div>
<h2>{organization.name}</h2>
<p>Tu rol: {membership.role}</p>
</div>
);
}Server-side
auth() helper
Obtener informacion de autenticacion en Server Components:
// app/dashboard/page.tsx
import { auth } from '@auris/nextjs/server';
export default async function DashboardPage() {
const { userId, sessionId } = await auth();
if (!userId) {
redirect('/sign-in');
}
return <div>Usuario autenticado: {userId}</div>;
}currentUser() helper
Obtener el usuario completo en el servidor:
// app/profile/page.tsx
import { currentUser } from '@auris/nextjs/server';
export default async function ProfilePage() {
const user = await currentUser();
if (!user) {
return <div>No autenticado</div>;
}
return (
<div>
<h1>{user.firstName} {user.lastName}</h1>
<p>{user.email}</p>
</div>
);
}API Routes
Proteger API routes con autenticacion:
// app/api/protected/route.ts
import { auth } from '@auris/nextjs/server';
import { NextResponse } from 'next/server';
export async function GET() {
const { userId } = await auth();
if (!userId) {
return NextResponse.json(
{ error: 'No autorizado' },
{ status: 401 }
);
}
return NextResponse.json({
message: 'Datos protegidos',
userId
});
}Personalizacion
Tema personalizado
<AurisProvider
appearance={{
variables: {
colorPrimary: '#4f46e5',
colorBackground: '#ffffff',
colorText: '#111827',
borderRadius: '0.75rem',
fontFamily: 'Inter, sans-serif',
},
elements: {
card: 'shadow-xl',
formButtonPrimary: 'bg-indigo-600 hover:bg-indigo-700',
},
}}
>
{children}
</AurisProvider>