Optare v1.0 is now available. Get started →
Start Here
Next.js SDK Example

Next.js App Router Integration

This example demonstrates how to integrate Optare ID using our dedicated SDK @optare/optareid-nextjs.

📦 Installation

npm install @optare/optareid-nextjs

⚙️ Configuration

Create app/api/auth/[...optare]/route.ts:

// app/api/auth/[...optare]/route.ts
import { createHandlers } from '@optare/optareid-nextjs';
 
export const { GET, POST } = createHandlers({
    clientId: process.env.OPTARE_CLIENT_ID!,
    clientSecret: process.env.OPTARE_CLIENT_SECRET!,
    secret: process.env.AUTH_SECRET!,
});

Wrap your application in app/layout.tsx:

// app/layout.tsx
import { OptareProvider } from '@optare/optareid-nextjs';
 
export default function RootLayout({ children }: { children: React.ReactNode }) {
    return (
        <html lang="en">
            <body>
                <OptareProvider>{children}</OptareProvider>
            </body>
        </html>
    );
}

💻 Usage Example

Here represents a complete login/logout flow with protected content:

// app/page.tsx
'use client';
 
import { useOptare, SignInButton, Authenticated, Unauthenticated, SignOutButton } from '@optare/optareid-nextjs';
 
export default function HomePage() {
    const { user, isLoading } = useOptare();
 
    if (isLoading) {
        return <div className="loading">Loading...</div>;
    }
 
    return (
        <main className="container">
            <h1>Optare ID + Next.js Example</h1>
 
            <Authenticated>
                <div className="user-card">
                    <p><strong>Logged in as:</strong> {user?.name || user?.email}</p>
                    <p><strong>Email:</strong> {user?.email}</p>
                    {user?.organizationId && (
                        <p><strong>Organization:</strong> {user.organizationId}</p>
                    )}
                    <SignOutButton className="btn btn-danger">
                        Sign Out
                    </SignOutButton>
                </div>
            </Authenticated>
 
            <Unauthenticated>
                <div className="guest">
                    <p>You are not logged in.</p>
                    <SignInButton className="btn btn-primary">
                        Sign In with Optare
                    </SignInButton>
                </div>
            </Unauthenticated>
        </main>
    );
}

🔑 Environment Variables

Add these to your .env.local:

OPTARE_CLIENT_ID=your_client_id
OPTARE_CLIENT_SECRET=your_client_secret
AUTH_SECRET=generate_a_random_string_here
NEXT_PUBLIC_OPTARE_URL=https://id.optare.one