Awesome-omni-skill auth0-nextjs
Use when adding authentication to Next.js applications with both server and client-side auth - supports App Router and Pages Router with @auth0/nextjs-auth0 SDK
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/auth0-nextjs-chris-sev" ~/.claude/skills/diegosouzapw-awesome-omni-skill-auth0-nextjs && rm -rf "$T"
skills/development/auth0-nextjs-chris-sev/SKILL.mdAuth0 Next.js Integration
Add authentication to Next.js applications using @auth0/nextjs-auth0. Supports both App Router and Pages Router.
Prerequisites
- Next.js 13+ application (App Router or Pages Router)
- Auth0 account and application configured
- If you don't have Auth0 set up yet, use the
skill firstauth0-quickstart
When NOT to Use
- Client-side only React apps - Use
for Vite/CRA SPAsauth0-react - React Native mobile apps - Use
for iOS/Androidauth0-react-native - Non-Next.js frameworks - Use framework-specific SDKs (Express, Vue, Angular, etc.)
- Stateless APIs only - Use JWT validation middleware if you don't need session management
Quick Start Workflow
1. Install SDK
npm install @auth0/nextjs-auth0
2. Configure Environment
For automated setup with Auth0 CLI, see Setup Guide for complete scripts.
For manual setup:
Create
.env.local:
AUTH0_SECRET=<generate-a-32-character-secret> APP_BASE_URL=http://localhost:3000 AUTH0_DOMAIN=your-tenant.auth0.com AUTH0_CLIENT_ID=your-client-id AUTH0_CLIENT_SECRET=your-client-secret
Generate secret:
openssl rand -hex 32
Important: Add
.env.local to .gitignore
3. Create Auth0 Client and Middleware
Create
lib/auth0.ts:
import { Auth0Client } from '@auth0/nextjs-auth0/server'; export const auth0 = new Auth0Client({ domain: process.env.AUTH0_DOMAIN!, clientId: process.env.AUTH0_CLIENT_ID!, clientSecret: process.env.AUTH0_CLIENT_SECRET!, secret: process.env.AUTH0_SECRET!, appBaseUrl: process.env.APP_BASE_URL!, });
Middleware Configuration (Next.js 15 vs 16):
Next.js 15 - Create
middleware.ts at project root:
import { NextRequest } from 'next/server'; import { auth0 } from './lib/auth0'; export async function middleware(request: NextRequest) { return await auth0.middleware(request); } export const config = { matcher: [ '/((?!_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)', ], };
Next.js 16 - You have two options:
Option 1: Use
middleware.ts (same as Next.js 15):
import { NextRequest } from 'next/server'; import { auth0 } from './lib/auth0'; export async function middleware(request: NextRequest) { return await auth0.middleware(request); } export const config = { matcher: [ '/((?!_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)', ], };
Option 2: Use
proxy.ts at project root:
import { NextRequest } from 'next/server'; import { auth0 } from './lib/auth0'; export async function proxy(request: NextRequest) { return await auth0.middleware(request); } export const config = { matcher: [ '/((?!_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)', ], };
This automatically creates endpoints:
- Login/auth/login
- Logout/auth/logout
- OAuth callback/auth/callback
- User profile/auth/profile
4. Add User Context (Optional)
Note: In v4, wrapping with
<Auth0Provider> is optional. Only needed if you want to pass an initial user during server rendering to useUser().
App Router - Optionally wrap app in
app/layout.tsx:
import { Auth0Provider } from '@auth0/nextjs-auth0/client'; import { auth0 } from './lib/auth0'; export default async function RootLayout({ children }: { children: React.ReactNode }) { const session = await auth0.getSession(); return ( <html> <body> <Auth0Provider user={session?.user}>{children}</Auth0Provider> </body> </html> ); }
Pages Router - Optionally wrap app in
pages/_app.tsx:
import { Auth0Provider } from '@auth0/nextjs-auth0/client'; import type { AppProps } from 'next/app'; export default function App({ Component, pageProps }: AppProps) { return ( <Auth0Provider user={pageProps.user}> <Component {...pageProps} /> </Auth0Provider> ); }
5. Add Authentication UI
Client Component (works in both routers):
'use client'; // Only needed for App Router import { useUser } from '@auth0/nextjs-auth0/client'; export default function Profile() { const { user, isLoading } = useUser(); if (isLoading) return <div>Loading...</div>; if (user) { return ( <div> <img src={user.picture} alt={user.name} /> <h2>Welcome, {user.name}!</h2> <a href="/auth/logout">Logout</a> </div> ); } return <a href="/auth/login">Login</a>; }
6. Test Authentication
Start your dev server:
npm run dev
Visit
http://localhost:3000 and test the login flow.
Detailed Documentation
- Setup Guide - Automated setup scripts, environment configuration, Auth0 CLI usage
- Integration Guide - Server-side auth, protected routes, API routes, middleware
- API Reference - Complete SDK API, hooks, helpers, session management
Common Mistakes
| Mistake | Fix |
|---|---|
| Using v3 environment variables | v4 uses and (not or ) |
| Forgot to add callback URL in Auth0 Dashboard | Add to Allowed Callback URLs (e.g., ) |
| Missing middleware configuration | v4 requires middleware to mount auth routes - create (Next.js 15+16) or (Next.js 16 only) with |
| Wrong route paths | v4 uses not - routes drop the prefix |
| Missing or weak AUTH0_SECRET | Generate secure secret with and store in .env.local |
| Using .env instead of .env.local | Next.js requires .env.local for local secrets, and .env.local should be in .gitignore |
| App created as SPA type in Auth0 | Must be Regular Web Application type for Next.js |
| Using removed v3 helpers | v4 removed and - use instead |
| Using useUser in Server Component | useUser is client-only, use for Server Components |
| AUTH0_DOMAIN includes https:// | v4 should be just the domain (e.g., ), no scheme |
Related Skills
- Basic Auth0 setupauth0-quickstart
- Migrate from another auth providerauth0-migration
- Add Multi-Factor Authenticationauth0-mfa
Quick Reference
V4 Setup:
- Create
withlib/auth0.ts
instanceAuth0Client - Create middleware configuration (required):
- Next.js 15:
withmiddleware.ts
functionmiddleware() - Next.js 16:
withmiddleware.ts
ORmiddleware()
withproxy.ts
functionproxy()
- Next.js 15:
- Optional: Wrap with
for SSR user<Auth0Provider>
Client-Side Hooks:
- Get user in client componentsuseUser()
- User profile objectuser
- Loading stateisLoading
Server-Side Methods:
- Get session in Server Components/API routes/middlewareauth0.getSession()
- Get access token for calling APIsauth0.getAccessToken()
Common Use Cases:
- Login/Logout links → Use
and/auth/login
paths (see Step 5)/auth/logout - Protected pages (App Router) → Integration Guide
- Protected pages (Pages Router) → Integration Guide
- API routes with auth → Integration Guide
- Middleware protection → Integration Guide