Next.js Quickstart (Pages Router)
Before you start
Example repository
Create a new Next.js app
If you don't already have a Next.js app (Pages Router), run the following commands to create a new one.
npm create next-app@latest clerk-nextjs-pages -- --no-app
cd clerk-nextjs-pages
npm installpnpm create next-app clerk-nextjs-pages --no-app
cd clerk-nextjs-pages
pnpm installyarn create next-app clerk-nextjs-pages --no-app
cd clerk-nextjs-pages
yarn installbunx create-next-app clerk-nextjs-pages --no-app
cd clerk-nextjs-pages
bun installInstall @clerk/nextjs
The Clerk Next.js SDK gives you access to prebuilt components, hooks, and helpers to make user authentication easier.
Run the following command to install the SDK:
npm install @clerk/nextjspnpm add @clerk/nextjsyarn add @clerk/nextjsbun add @clerk/nextjsAdd the following keys to your .env file. These keys can always be retrieved from the API keys page in the Clerk Dashboard.
- In the Clerk Dashboard, navigate to the API keys page.
- In the Quick Copy section, copy your Clerk and .
- Paste your keys into your
.envfile.
The final result should resemble the following:
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_KEY
CLERK_SECRET_KEY=YOUR_SECRET_KEYAdd clerkMiddleware() to your app
clerkMiddleware() grants you access to user authentication state throughout your app. It also allows you to protect specific routes from unauthenticated users. To add clerkMiddleware() to your app, follow these steps:
-
Create a
proxy.tsfile.- If you're using the
/srcdirectory, createproxy.tsin the/srcdirectory. - If you're not using the
/srcdirectory, createproxy.tsin the root directory alongside.env.
- If you're using the
-
In your
proxy.tsfile, export theclerkMiddleware()helper:proxy.ts import { clerkMiddleware } from '@clerk/nextjs/server' export default clerkMiddleware() export const config = { matcher: [ // Skip Next.js internals and all static files, unless found in search params '/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)', // Always run for API routes '/(api|trpc)(.*)', ], } -
By default,
clerkMiddleware()will not protect any routes. All routes are public and you must opt-in to protection for routes. See theclerkMiddleware()reference to learn how to require authentication for specific routes.
Add <ClerkProvider> to your app
The <ClerkProvider> component provides session and user context to Clerk's hooks and components. It's recommended to wrap your entire app at the entry point with <ClerkProvider> to make authentication globally accessible. See the reference docs for other configuration options.
Add the <ClerkProvider> component to your app, as shown in the following example:
import '@/styles/globals.css'
import { ClerkProvider } from '@clerk/nextjs'
import type { AppProps } from 'next/app'
function MyApp({ Component, pageProps }: AppProps) {
return (
<ClerkProvider
{...pageProps}
appearance={{
cssLayerName: 'clerk',
}}
>
<Component {...pageProps} />
</ClerkProvider>
)
}
export default MyAppUpdate globals.css
In the previous step, the cssLayerName property is set on the <ClerkProvider> component. Now, you need to add the following line to the top of your globals.css file in order to include the layer you named in the cssLayerName property. The example names the layer clerk but you can name it anything you want. These steps are necessary for v4 of Tailwind as it ensures that Tailwind's utility styles are applied after Clerk's styles.
@layer theme, base, clerk, components, utilities;
@import 'tailwindcss';Create a header with Clerk components
You can control which content signed-in and signed-out users can see with the prebuilt control components. The following example creates a header using the following components:
- <SignedIn>: Children of this component can only be seen while signed in.
- <SignedOut>: Children of this component can only be seen while signed out.
- <UserButton />: Shows the signed-in user's avatar. Selecting it opens a dropdown menu with account management options.
- <SignInButton />: An unstyled component that links to the sign-in page. In this example, since no props or environment variables are set for the sign-in URL, this component links to the Account Portal sign-in page.
- <SignUpButton />: An unstyled component that links to the sign-up page. In this example, since no props or environment variables are set for the sign-up URL, this component links to the Account Portal sign-up page.
import '@/styles/globals.css'
import {
ClerkProvider,
SignInButton,
SignUpButton,
SignedIn,
SignedOut,
UserButton,
} from '@clerk/nextjs'
import type { AppProps } from 'next/app'
function MyApp({ Component, pageProps }: AppProps) {
return (
<ClerkProvider
{...pageProps}
appearance={{
cssLayerName: 'clerk',
}}
>
<header className="flex justify-end items-center p-4 gap-4 h-16">
{/* Show the sign-in and sign-up buttons when the user is signed out */}
<SignedOut>
<SignInButton />
<SignUpButton>
<button className="bg-[#6c47ff] text-white rounded-full font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 cursor-pointer">
Sign Up
</button>
</SignUpButton>
</SignedOut>
{/* Show the user button when the user is signed in */}
<SignedIn>
<UserButton />
</SignedIn>
</header>
<Component {...pageProps} />
</ClerkProvider>
)
}
export default MyAppRun your project
Run your project with the following command:
npm run devpnpm run devyarn devbun run devCreate your first user
- Visit your app's homepage at http://localhost:3000.
- Select "Sign up" on the page and authenticate to create your first user.
Next steps
Learn more about Clerk authentication flows, route protection, user data access, and deploying your app using the following guides.
Create a custom sign-in or sign-up page
This tutorial gets you started with Clerk's <SignInButton /> component, which uses the Account Portal. If you don't want to use the Account Portal, read this guide about creating a custom authentication page.
Add custom onboarding to your authentication flow
If you need to collect additional information about users that Clerk's Account Portal or prebuilt components don't collect, read this guide about adding a custom onboarding flow to your authentication flow.
Protect specific routes
This tutorial taught you that by default, clerkMiddleware() will not protect any routes. Read this reference doc to learn how to protect specific routes from unauthenticated users.
Protect content and read user data
Learn how to use Clerk's hooks and helpers to access the session and user data in your Next.js app.
Next.js SDK Reference
Learn more about the Clerk Next.js SDK and how to use it.
Deploy to Production
Learn how to deploy your Clerk app to production.
Feedback
Last updated on