Middleware
If you plan to use Next.js API routes or server-side rendering with getAuth
, you must install withClerkMiddleware
in your Next.js middleware. Otherwise, you can skip this step.
Copy this snippet into a file named middleware.js or middleware.ts in your project root.
1import { withClerkMiddleware } from "@clerk/nextjs/server";2import { NextResponse } from "next/server";34export default withClerkMiddleware((req) => {5return NextResponse.next();6});78// Stop Middleware running on static files9export const config = { matcher: '/((?!_next/image|_next/static|favicon.ico).*)',};
1import { withClerkMiddleware } from "@clerk/nextjs/server";2import { NextResponse } from "next/server";3import type { NextRequest } from 'next/server'45export default withClerkMiddleware((req: NextRequest) => {6return NextResponse.next();7});89// Stop Middleware running on static files10export const config = { matcher: '/((?!_next/image|_next/static|favicon.ico).*)',};11
1import { withClerkMiddleware, getAuth } from '@clerk/nextjs/server'2import { NextResponse } from 'next/server'3import type { NextRequest } from 'next/server'45// Set the paths that don't require the user to be signed in6const publicPaths = ['/', '/sign-in*', '/sign-up*']78const isPublic = (path: string) => {9return publicPaths.find(x =>10path.match(new RegExp(`^${x}$`.replace('*$', '($|/)')))11)12}1314export default withClerkMiddleware((request: NextRequest) => {15if (isPublic(request.nextUrl.pathname)) {16return NextResponse.next()17}18// if the user is not signed in redirect them to the sign in page.19const { userId } = getAuth(request)2021if (!userId) {22// redirect the users to /pages/sign-in/[[...index]].ts2324const signInUrl = new URL('/sign-in', request.url)25signInUrl.searchParams.set('redirect_url', request.url)26return NextResponse.redirect(signInUrl)27}28return NextResponse.next()29})3031export const config = { matcher: '/((?!_next/image|_next/static|favicon.ico).*)',};
Clerk only depends on the withClerkMiddleware()
wrapper. You are welcome to customize the internal middleware function as needed.
Before Next.js 12.2
Using the withEdgeMiddlewareAuth
wrapper you can access authentication data
1import { withEdgeMiddlewareAuth } from "@clerk/nextjs/edge-middleware";23export default withEdgeMiddlewareAuth(async req => {4const { userId, sessionId, getToken } = req.auth;5const supabaseToken = await getToken({ template: 'supabase' })6// Run your middleware78// Complete response9return NextResponse.next();10});
1import { withEdgeMiddlewareAuth } from '@clerk/nextjs/edge-middleware'2import { NextResponse, NextRequest } from 'next/server'3import { ServerGetToken } from '@clerk/types'45//example usage of interfaces with Clerk6interface ClerkRequest extends NextRequest {7auth: {8userId?: string | null9sessionId?: string | null10getToken: ServerGetToken11}12}1314export default withEdgeMiddlewareAuth(async (req: ClerkRequest) => {15const { userId, sessionId, getToken } = req.auth16const supabaseToken = await getToken({ template: 'supabase' })17// Load any data your application needs for the API route18return NextResponse.next();19})
Example Response
{sessionId: 'sess_2GaMqUCB3Sc1WNAkWuNzsnYVVEy',userId: 'user_2F2u1wtUyUlxKgFkKqtJNtpJJWj',orgId: null,getToken: [AsyncFunction (anonymous)],claims: {azp: 'http://localhost:3000',exp: 1666622607,iat: 1666622547,iss: 'https://clerk.quiet.muskox-85.lcl.dev',nbf: 1666622537,sid: 'sess_2GaMqUCB3Sc1WNAkWuNzsnYVVEy',sub: 'user_2F2u1wtUyUlxKgFkKqtJNtpJJWj'}}
More detailed information about the fields in this object can be found in the Authentication Object documentation.