Loading...
Loading...
Integrate WorkOS AuthKit with Next.js App Router (13+). Server-side rendering required.
npx skill4agent add workos/skills workos-authkit-nextjshttps://github.com/workos/authkit-nextjs/blob/main/README.mdnext.config.jsnext.config.mjspackage.json"next".env.localWORKOS_API_KEYsk_WORKOS_CLIENT_IDclient_NEXT_PUBLIC_WORKOS_REDIRECT_URIWORKOS_COOKIE_PASSWORDpackage.jsonNext.js version?
|
+-- 16+ --> Create proxy.ts at project root
|
+-- 15 --> Create middleware.ts (cookies() is async - handlers must await)
|
+-- 13-14 --> Create middleware.ts (cookies() is sync)src/app/authkitMiddleware()middleware.tsauthkit()authkitMiddlewareimport { NextRequest, NextResponse } from 'next/server';
import { authkit, handleAuthkitHeaders } from '@workos-inc/authkit-nextjs';
export default async function middleware(request: NextRequest) {
// 1. Get auth session and headers from AuthKit
const { session, headers, authorizationUrl } = await authkit(request);
const { pathname } = request.nextUrl;
// 2. === YOUR EXISTING MIDDLEWARE LOGIC ===
// Rate limiting, logging, custom headers, etc.
const rateLimitResult = checkRateLimit(request);
if (!rateLimitResult.allowed) {
return new NextResponse('Too Many Requests', { status: 429 });
}
// 3. Protect routes - redirect to auth if needed
if (pathname.startsWith('/dashboard') && !session.user && authorizationUrl) {
return handleAuthkitHeaders(request, headers, { redirect: authorizationUrl });
}
// 4. Continue with AuthKit headers properly handled
return handleAuthkitHeaders(request, headers);
}authkit(request){ session, headers, authorizationUrl }handleAuthkitHeaders(request, headers, options?)partitionAuthkitHeaders()applyResponseHeaders()handleAuthkitHeaders()withAuth()NEXT_PUBLIC_WORKOS_REDIRECT_URIURI path --> Route location
/auth/callback --> app/auth/callback/route.ts
/callback --> app/callback/route.tshandleAuth()// CORRECT - Next.js 15+ requires async route handlers
export const GET = handleAuth();
// If handleAuth returns a function, ensure it's awaited in request contextAuthKitProviderapp/layout.tsxuseAuth()// app/layout.tsx
import { AuthKitProvider } from '@workos-inc/authkit-nextjs';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<AuthKitProvider>{children}</AuthKitProvider>
</body>
</html>
);
}@workos-inc/authkit-nextjs/componentsapp/page.tsxgetUsergetSignInUrlsignOut# 1. Check middleware/proxy exists (one should match)
ls proxy.ts middleware.ts src/proxy.ts src/middleware.ts 2>/dev/null
# 2. CRITICAL: Check AuthKitProvider is in layout (REQUIRED)
grep "AuthKitProvider" app/layout.tsx || echo "FAIL: AuthKitProvider missing from layout"
# 3. Check callback route exists
find app -name "route.ts" -path "*/callback/*"
# 4. Build succeeds
npm run buildhandleAuth()export const GET = handleAuth();asynccookies()src/app/'use client'NEXT_PUBLIC_*