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-js2. Get Your Credentials
- Log in to Optare Console (opens in a new tab)
- Create an OAuth client with redirect URI:
https://yourapp.com/api/auth/callback - 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_secret4. 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
- Next.js App Router - Upgrade to App Router
- Protected Routes - Require auth for pages