Optare v1.0 is now available. Get started →
Quickstarts
Next.js (Pages)

Add Login to Next.js (Pages Router)

This quickstart covers Next.js with the Pages Router (versions 12-13).

Prerequisites

  • Node.js 18+ installed
  • An Optare account
  • Next.js app with Pages Router

1. Install the SDK

npm install @optare/optareid-react @optare/optareid-js

2. Get Your Credentials

  1. Log in to Optare Console (opens in a new tab)
  2. Create an OAuth client with redirect URI: https://yourapp.com/api/auth/callback
  3. Copy Client ID and Client Secret

3. Configure Environment

Create .env.local:

NEXT_PUBLIC_OPTARE_DOMAIN=https://id.optare.one
NEXT_PUBLIC_OPTARE_CLIENT_ID=your_client_id
OPTARE_CLIENT_SECRET=your_client_secret

4. Create API Routes

Create pages/api/auth/[...optare].ts:

import { NextApiHandler } from 'next';
 
const handler: NextApiHandler = async (req, res) => {
  const action = req.query.optare?.[0];
 
  if (action === 'login') {
    const params = new URLSearchParams({
      client_id: process.env.NEXT_PUBLIC_OPTARE_CLIENT_ID!,
      redirect_uri: `${process.env.NEXT_PUBLIC_APP_URL}/api/auth/callback`,
      response_type: 'code',
      scope: 'openid profile email organization',
    });
    res.redirect(`${process.env.NEXT_PUBLIC_OPTARE_DOMAIN}/oauth/authorize?${params}`);
  }
  
  // Add callback and logout handlers...
};
 
export default handler;

5. Add Provider

Wrap your app in pages/_app.tsx:

import { OptareProvider } from '@optare/optareid-react';
import type { AppProps } from 'next/app';
 
export default function App({ Component, pageProps }: AppProps) {
  return (
    <OptareProvider
      domain={process.env.NEXT_PUBLIC_OPTARE_DOMAIN!}
      clientId={process.env.NEXT_PUBLIC_OPTARE_CLIENT_ID!}
    >
      <Component {...pageProps} />
    </OptareProvider>
  );
}

6. Use in Pages

import { useOptare } from '@optare/optareid-react';
 
export default function Home() {
  const { user, isAuthenticated, login, logout } = useOptare();
 
  return (
    <div>
      {isAuthenticated ? (
        <>
          <p>Welcome, {user?.email}</p>
          <button onClick={logout}>Log Out</button>
        </>
      ) : (
        <button onClick={login}>Log In</button>
      )}
    </div>
  );
}

7. Server-Side Authentication

Use getServerSideProps:

import { GetServerSideProps } from 'next';
 
export const getServerSideProps: GetServerSideProps = async (context) => {
  const token = context.req.cookies['optare-session'];
  
  if (!token) {
    return {
      redirect: { destination: '/api/auth/login', permanent: false }
    };
  }
 
  return { props: { user: /* decoded token */ } };
};

Next Steps