[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6K1M7RGFP7MR41PT9CWCXS3":3,"skill-same:01M6K1M7RGFP7MR41PT9CWCXS3":152},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":129,"commitSha":130,"skillDirectory":131,"forksCount":132,"repositoryHtmlUrl":133,"repositoryHomepageUrl":6,"ownerHtmlUrl":134,"ownerBlogUrl":135,"ownerDescription":136,"updatedAt":137,"install":138,"resources":151},"01M6K1M7RGFP7MR41PT9CWCXS3","auth",null,"Authentication integration guidance — Clerk (native Vercel Marketplace), Descope, and Auth0 setup for Next.js applications. Covers middleware auth patterns, sign-in\u002Fsign-up flows, and Marketplace provisioning. Use when implementing user authentication.","NagyVikt\u002Fcodex-plugins","NagyVikt","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F137165288?v=4","01M6K0SJ3R2DAZRJKJJS10VN87","Viktor Nagy","01M6K0SJ9HXN0GBD91QDQ9WNVV",2,"MIT","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fauth\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"app","breach","for","implementing","login","auth0","csrf protection","authjs","getting-started","import","manage","provider","clerk","system","csrf","authentication","secure","identity","config","2026-11-10 10:12:30",false,"---\nname: auth\ndescription: Authentication integration guidance — Clerk (native Vercel Marketplace), Descope, and Auth0 setup for Next.js applications. Covers middleware auth patterns, sign-in\u002Fsign-up flows, and Marketplace provisioning. Use when implementing user authentication.\nmetadata:\n  priority: 6\n  docs:\n    - \"https:\u002F\u002Fauthjs.dev\u002Fgetting-started\"\n    - \"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fbuilding-your-application\u002Fauthentication\"\n  sitemap: \"https:\u002F\u002Fauthjs.dev\u002Fsitemap.xml\"\n  pathPatterns:\n    - 'middleware.ts'\n    - 'middleware.js'\n    - 'src\u002Fmiddleware.ts'\n    - 'src\u002Fmiddleware.js'\n    - 'clerk.config.*'\n    - 'app\u002Fsign-in\u002F**'\n    - 'app\u002Fsign-up\u002F**'\n    - 'src\u002Fapp\u002Fsign-in\u002F**'\n    - 'src\u002Fapp\u002Fsign-up\u002F**'\n    - 'app\u002F(auth)\u002F**'\n    - 'src\u002Fapp\u002F(auth)\u002F**'\n    - 'auth.config.*'\n    - 'auth.ts'\n    - 'auth.js'\n  bashPatterns:\n    - '\\bnpm\\s+(install|i|add)\\s+[^\\n]*@clerk\u002Fnextjs\\b'\n    - '\\bpnpm\\s+(install|i|add)\\s+[^\\n]*@clerk\u002Fnextjs\\b'\n    - '\\bbun\\s+(install|i|add)\\s+[^\\n]*@clerk\u002Fnextjs\\b'\n    - '\\byarn\\s+add\\s+[^\\n]*@clerk\u002Fnextjs\\b'\n    - '\\bnpm\\s+(install|i|add)\\s+[^\\n]*@descope\u002Fnextjs-sdk\\b'\n    - '\\bpnpm\\s+(install|i|add)\\s+[^\\n]*@descope\u002Fnextjs-sdk\\b'\n    - '\\bbun\\s+(install|i|add)\\s+[^\\n]*@descope\u002Fnextjs-sdk\\b'\n    - '\\byarn\\s+add\\s+[^\\n]*@descope\u002Fnextjs-sdk\\b'\n    - '\\bnpm\\s+(install|i|add)\\s+[^\\n]*@auth0\u002Fnextjs-auth0\\b'\n    - '\\bpnpm\\s+(install|i|add)\\s+[^\\n]*@auth0\u002Fnextjs-auth0\\b'\n    - '\\bbun\\s+(install|i|add)\\s+[^\\n]*@auth0\u002Fnextjs-auth0\\b'\n    - '\\byarn\\s+add\\s+[^\\n]*@auth0\u002Fnextjs-auth0\\b'\nvalidate:\n  -\n    pattern: 'VERCEL_CLIENT_(ID|SECRET)|vercel\\.com\u002Foauth\u002F(authorize|access_token|token)'\n    message: 'Hand-rolled Vercel OAuth detected. Use the dedicated Sign in with Vercel skill for OIDC-based Vercel identity.'\n    severity: recommended\n    upgradeToSkill: sign-in-with-vercel\n    upgradeWhy: 'Replace manual Vercel OAuth token exchange with the Sign in with Vercel OIDC provider.'\n    skipIfFileContains: 'signInWithVercel|@vercel\u002Fauth'\nretrieval:\n  aliases:\n    - authentication\n    - login system\n    - sign in\n    - auth flow\n  intents:\n    - add auth\n    - protect routes\n    - manage sessions\n    - implement login\n    - secure api endpoints\n  entities:\n    - NextAuth\n    - Auth.js\n    - JWT\n    - OAuth\n    - session\n    - middleware\n    - getServerSession\n  examples:\n    - add login to my app\n    - protect this route with auth\n    - set up NextAuth\nchainTo:\n  -\n    pattern: 'VERCEL_CLIENT_(ID|SECRET)|vercel\\.com\u002Foauth\u002F(authorize|access_token|token)'\n    targetSkill: sign-in-with-vercel\n    message: 'Hand-rolled Vercel OAuth detected — loading Sign in with Vercel OIDC guidance.'\n  -\n    pattern: 'export\\s+(default\\s+)?function\\s+middleware'\n    targetSkill: routing-middleware\n    message: 'Auth logic in middleware.ts — loading Routing Middleware guidance for proxy.ts migration in Next.js 16.'\n  -\n    pattern: 'from\\s+[''\\\"](jsonwebtoken)[''\"]|require\\s*\\(\\s*[''\\\"](jsonwebtoken)[''\"]|jwt\\.sign\\s*\\('\n    targetSkill: auth\n    message: 'Manual JWT handling with jsonwebtoken detected — use Clerk or Auth.js for managed auth with built-in JWT session handling, CSRF protection, and token rotation.'\n  -\n    pattern: 'from\\s+[''\\\"](next-auth)[''\"]|NextAuthOptions|authOptions\\s*:'\n    targetSkill: auth\n    message: 'Legacy next-auth (v4) pattern detected — loading auth guidance for Auth.js v5 migration with the new universal auth() helper.'\n  -\n    pattern: \"from\\\\s+['\\\"]@clerk\u002Fnextjs['\\\"]\"\n    targetSkill: auth\n    message: 'Clerk import detected — loading Auth guidance for Clerk v7 patterns, middleware setup, organization handling, and Vercel Marketplace integration.'\n    skipIfFileContains: 'clerkMiddleware|ClerkProvider'\n  -\n    pattern: \"bcrypt|argon2\"\n    targetSkill: auth\n    message: 'Manual password hashing detected (bcrypt\u002Fargon2) — use Clerk or Auth0 for managed authentication with built-in password hashing, rate limiting, and breach detection.'\n    skipIfFileContains: \"@clerk|@auth0\"\n---\n\n# Authentication Integrations\n\nYou are an expert in authentication for Vercel-deployed applications — covering Clerk (native Vercel Marketplace integration), Descope, and Auth0.\n\n## Clerk (Recommended — Native Marketplace Integration)\n\nClerk is a native Vercel Marketplace integration with auto-provisioned environment variables and unified billing. Current SDK: `@clerk\u002Fnextjs` v7 (Core 3, March 2026).\n\n### Install via Marketplace\n\n```bash\n# Install Clerk from Vercel Marketplace (auto-provisions env vars)\nvercel integration add clerk\n```\n\nAuto-provisioned environment variables:\n- `CLERK_SECRET_KEY` — server-side API key\n- `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` — client-side publishable key\n\n### SDK Setup\n\n```bash\n# Install the Clerk Next.js SDK\nnpm install @clerk\u002Fnextjs\n```\n\n### Middleware Configuration\n\n```ts\n\u002F\u002F middleware.ts\nimport { clerkMiddleware } from \"@clerk\u002Fnextjs\u002Fserver\";\n\nexport default clerkMiddleware();\n\nexport const config = {\n  matcher: [\n    \u002F\u002F Skip Next.js internals and static files\n    \"\u002F((?!_next|[^?]*\\\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)\",\n    \u002F\u002F Always run for API routes\n    \"\u002F(api|trpc)(.*)\",\n  ],\n};\n```\n\n### Protect Routes\n\n```ts\n\u002F\u002F middleware.ts — protect specific routes\nimport { clerkMiddleware, createRouteMatcher } from \"@clerk\u002Fnextjs\u002Fserver\";\n\nconst isProtectedRoute = createRouteMatcher([\"\u002Fdashboard(.*)\", \"\u002Fapi(.*)\"]);\n\nexport default clerkMiddleware(async (auth, req) => {\n  if (isProtectedRoute(req)) {\n    await auth.protect();\n  }\n});\n```\n\n### Frontend API Proxy (Core 3)\n\nProxy Clerk's Frontend API through your own domain to avoid third-party requests:\n\n```ts\n\u002F\u002F middleware.ts\nexport default clerkMiddleware({\n  frontendApiProxy: { enabled: true },\n});\n```\n\n### Provider Setup\n\n```tsx\n\u002F\u002F app\u002Flayout.tsx\nimport { ClerkProvider } from \"@clerk\u002Fnextjs\";\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  return (\n    \u003CClerkProvider>\n      \u003Chtml lang=\"en\">\n        \u003Cbody>{children}\u003C\u002Fbody>\n      \u003C\u002Fhtml>\n    \u003C\u002FClerkProvider>\n  );\n}\n```\n\n### Sign-In and Sign-Up Pages\n\n```tsx\n\u002F\u002F app\u002Fsign-in\u002F[[...sign-in]]\u002Fpage.tsx\nimport { SignIn } from \"@clerk\u002Fnextjs\";\n\nexport default function Page() {\n  return \u003CSignIn \u002F>;\n}\n```\n\n```tsx\n\u002F\u002F app\u002Fsign-up\u002F[[...sign-up]]\u002Fpage.tsx\nimport { SignUp } from \"@clerk\u002Fnextjs\";\n\nexport default function Page() {\n  return \u003CSignUp \u002F>;\n}\n```\n\nAdd routing env vars to `.env.local`:\n\n```env\nNEXT_PUBLIC_CLERK_SIGN_IN_URL=\u002Fsign-in\nNEXT_PUBLIC_CLERK_SIGN_UP_URL=\u002Fsign-up\n```\n\n### Access User Data\n\n```tsx\n\u002F\u002F Server component\nimport { currentUser } from \"@clerk\u002Fnextjs\u002Fserver\";\n\nexport default async function Page() {\n  const user = await currentUser();\n  return \u003Cp>Hello, {user?.firstName}\u003C\u002Fp>;\n}\n```\n\n```tsx\n\u002F\u002F Client component\n\"use client\";\nimport { useUser } from \"@clerk\u002Fnextjs\";\n\nexport default function UserGreeting() {\n  const { user, isLoaded } = useUser();\n  if (!isLoaded) return null;\n  return \u003Cp>Hello, {user?.firstName}\u003C\u002Fp>;\n}\n```\n\n### API Route Protection\n\n```ts\n\u002F\u002F app\u002Fapi\u002Fprotected\u002Froute.ts\nimport { auth } from \"@clerk\u002Fnextjs\u002Fserver\";\n\nexport async function GET() {\n  const { userId } = await auth();\n  if (!userId) {\n    return Response.json({ error: \"Unauthorized\" }, { status: 401 });\n  }\n  return Response.json({ userId });\n}\n```\n\n## Descope\n\nDescope is available on the Vercel Marketplace with native integration support.\n\n### Install via Marketplace\n\n```bash\nvercel integration add descope\n```\n\n### SDK Setup\n\n```bash\nnpm install @descope\u002Fnextjs-sdk\n```\n\n### Provider and Middleware\n\n```tsx\n\u002F\u002F app\u002Flayout.tsx\nimport { AuthProvider } from \"@descope\u002Fnextjs-sdk\";\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  return (\n    \u003CAuthProvider projectId={process.env.NEXT_PUBLIC_DESCOPE_PROJECT_ID!}>\n      \u003Chtml lang=\"en\">\n        \u003Cbody>{children}\u003C\u002Fbody>\n      \u003C\u002Fhtml>\n    \u003C\u002FAuthProvider>\n  );\n}\n```\n\n```ts\n\u002F\u002F middleware.ts\nimport { authMiddleware } from \"@descope\u002Fnextjs-sdk\u002Fserver\";\n\nexport default authMiddleware({\n  projectId: process.env.DESCOPE_PROJECT_ID!,\n  publicRoutes: [\"\u002F\", \"\u002Fsign-in\"],\n});\n```\n\n### Sign-In Flow\n\n```tsx\n\"use client\";\nimport { Descope } from \"@descope\u002Fnextjs-sdk\";\n\nexport default function SignInPage() {\n  return \u003CDescope flowId=\"sign-up-or-in\" \u002F>;\n}\n```\n\n## Auth0\n\nAuth0 provides a mature authentication platform with extensive identity provider support.\n\n### SDK Setup\n\n```bash\nnpm install @auth0\u002Fnextjs-auth0\n```\n\n### Configuration\n\n```ts\n\u002F\u002F lib\u002Fauth0.ts\nimport { Auth0Client } from \"@auth0\u002Fnextjs-auth0\u002Fserver\";\n\nexport const auth0 = new Auth0Client();\n```\n\nRequired environment variables:\n\n```env\nAUTH0_SECRET=\u003Crandom-secret>\nAUTH0_BASE_URL=http:\u002F\u002Flocalhost:3000\nAUTH0_ISSUER_BASE_URL=https:\u002F\u002Fyour-tenant.auth0.com\nAUTH0_CLIENT_ID=\u003Cclient-id>\nAUTH0_CLIENT_SECRET=\u003Cclient-secret>\n```\n\n### Middleware\n\n```ts\n\u002F\u002F middleware.ts\nimport { auth0 } from \"@\u002Flib\u002Fauth0\";\nimport { NextRequest, NextResponse } from \"next\u002Fserver\";\n\nexport async function middleware(request: NextRequest) {\n  return await auth0.middleware(request);\n}\n\nexport const config = {\n  matcher: [\n    \"\u002F((?!_next\u002Fstatic|_next\u002Fimage|favicon.ico|sitemap.xml|robots.txt).*)\",\n  ],\n};\n```\n\n### Access Session Data\n\n```tsx\n\u002F\u002F Server component\nimport { auth0 } from \"@\u002Flib\u002Fauth0\";\n\nexport default async function Page() {\n  const session = await auth0.getSession();\n  return session ? (\n    \u003Cp>Hello, {session.user.name}\u003C\u002Fp>\n  ) : (\n    \u003Ca href=\"\u002Fauth\u002Flogin\">Log in\u003C\u002Fa>\n  );\n}\n```\n\n## Decision Matrix\n\n| Need | Recommended | Why |\n|------|------------|-----|\n| Fastest setup on Vercel | Clerk | Native Marketplace, auto-provisioned env vars |\n| Passwordless \u002F social login flows | Descope | Visual flow builder, Marketplace native |\n| Enterprise SSO \u002F SAML \u002F multi-tenant | Auth0 | Deep enterprise identity support |\n| Pre-built UI components | Clerk | Drop-in `\u003CSignIn \u002F>`, `\u003CUserButton \u002F>` |\n| Vercel unified billing | Clerk or Descope | Both are native Marketplace integrations |\n\n## Clerk Core 3 Breaking Changes (March 2026)\n\nClerk provides an upgrade CLI that scans your codebase and applies codemods: `npx @clerk\u002Fupgrade`. Requires **Node.js 20.9.0+**.\n\n- **`auth()` is async** — always use `const { userId } = await auth()`, not synchronous\n- **`auth.protect()` moved** — use `await auth.protect()` directly, not from the return value of `auth()`\n- **`clerkClient()` is async** — use `await clerkClient()` in middleware handlers\n- **`authMiddleware()` removed** — migrate to `clerkMiddleware()`\n- **`@clerk\u002Ftypes` deprecated** — import types from SDK subpath exports: `import type { UserResource } from '@clerk\u002Freact\u002Ftypes'` (works from any SDK package)\n- **`ClerkProvider` no longer forces dynamic rendering** — pass the `dynamic` prop if needed\n- **Cache components** — when using Next.js cache components, place `\u003CClerkProvider>` inside `\u003Cbody>`, not wrapping `\u003Chtml>`\n- **Satellite domains** — new `satelliteAutoSync` option skips handshake redirects when no session cookies exist\n- **Smaller bundles** — React is now shared across framework SDKs (~50KB gzipped savings)\n- **Better offline handling** — `getToken()` now correctly distinguishes signed-out from offline states\n\n## Cross-References\n\n- **Marketplace install and env var provisioning** → `⤳ skill: marketplace`\n- **Middleware routing patterns** → `⤳ skill: routing-middleware`\n- **Environment variable management** → `⤳ skill: env-vars`\n- **Vercel OAuth (Sign in with Vercel)** → `⤳ skill: sign-in-with-vercel`\n\n## Official Documentation\n\n- [Clerk + Vercel Marketplace](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fdeployments\u002Fvercel)\n- [Clerk Next.js Quickstart](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fquickstarts\u002Fnextjs)\n- [Descope Next.js SDK](https:\u002F\u002Fdocs.descope.com\u002Fgetting-started\u002Fnextjs)\n- [Auth0 Next.js SDK](https:\u002F\u002Fauth0.com\u002Fdocs\u002Fquickstart\u002Fwebapp\u002Fnextjs)\n","# Authentication Integrations\n\nYou are an expert in authentication for Vercel-deployed applications — covering Clerk (native Vercel Marketplace integration), Descope, and Auth0.\n\n## Clerk (Recommended — Native Marketplace Integration)\n\nClerk is a native Vercel Marketplace integration with auto-provisioned environment variables and unified billing. Current SDK: `@clerk\u002Fnextjs` v7 (Core 3, March 2026).\n\n### Install via Marketplace\n\n```bash\n# Install Clerk from Vercel Marketplace (auto-provisions env vars)\nvercel integration add clerk\n```\n\nAuto-provisioned environment variables:\n- `CLERK_SECRET_KEY` — server-side API key\n- `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` — client-side publishable key\n\n### SDK Setup\n\n```bash\n# Install the Clerk Next.js SDK\nnpm install @clerk\u002Fnextjs\n```\n\n### Middleware Configuration\n\n```ts\n\u002F\u002F middleware.ts\nimport { clerkMiddleware } from \"@clerk\u002Fnextjs\u002Fserver\";\n\nexport default clerkMiddleware();\n\nexport const config = {\n  matcher: [\n    \u002F\u002F Skip Next.js internals and static files\n    \"\u002F((?!_next|[^?]*\\\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)\",\n    \u002F\u002F Always run for API routes\n    \"\u002F(api|trpc)(.*)\",\n  ],\n};\n```\n\n### Protect Routes\n\n```ts\n\u002F\u002F middleware.ts — protect specific routes\nimport { clerkMiddleware, createRouteMatcher } from \"@clerk\u002Fnextjs\u002Fserver\";\n\nconst isProtectedRoute = createRouteMatcher([\"\u002Fdashboard(.*)\", \"\u002Fapi(.*)\"]);\n\nexport default clerkMiddleware(async (auth, req) => {\n  if (isProtectedRoute(req)) {\n    await auth.protect();\n  }\n});\n```\n\n### Frontend API Proxy (Core 3)\n\nProxy Clerk's Frontend API through your own domain to avoid third-party requests:\n\n```ts\n\u002F\u002F middleware.ts\nexport default clerkMiddleware({\n  frontendApiProxy: { enabled: true },\n});\n```\n\n### Provider Setup\n\n```tsx\n\u002F\u002F app\u002Flayout.tsx\nimport { ClerkProvider } from \"@clerk\u002Fnextjs\";\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  return (\n    \u003CClerkProvider>\n      \u003Chtml lang=\"en\">\n        \u003Cbody>{children}\u003C\u002Fbody>\n      \u003C\u002Fhtml>\n    \u003C\u002FClerkProvider>\n  );\n}\n```\n\n### Sign-In and Sign-Up Pages\n\n```tsx\n\u002F\u002F app\u002Fsign-in\u002F[[...sign-in]]\u002Fpage.tsx\nimport { SignIn } from \"@clerk\u002Fnextjs\";\n\nexport default function Page() {\n  return \u003CSignIn \u002F>;\n}\n```\n\n```tsx\n\u002F\u002F app\u002Fsign-up\u002F[[...sign-up]]\u002Fpage.tsx\nimport { SignUp } from \"@clerk\u002Fnextjs\";\n\nexport default function Page() {\n  return \u003CSignUp \u002F>;\n}\n```\n\nAdd routing env vars to `.env.local`:\n\n```env\nNEXT_PUBLIC_CLERK_SIGN_IN_URL=\u002Fsign-in\nNEXT_PUBLIC_CLERK_SIGN_UP_URL=\u002Fsign-up\n```\n\n### Access User Data\n\n```tsx\n\u002F\u002F Server component\nimport { currentUser } from \"@clerk\u002Fnextjs\u002Fserver\";\n\nexport default async function Page() {\n  const user = await currentUser();\n  return \u003Cp>Hello, {user?.firstName}\u003C\u002Fp>;\n}\n```\n\n```tsx\n\u002F\u002F Client component\n\"use client\";\nimport { useUser } from \"@clerk\u002Fnextjs\";\n\nexport default function UserGreeting() {\n  const { user, isLoaded } = useUser();\n  if (!isLoaded) return null;\n  return \u003Cp>Hello, {user?.firstName}\u003C\u002Fp>;\n}\n```\n\n### API Route Protection\n\n```ts\n\u002F\u002F app\u002Fapi\u002Fprotected\u002Froute.ts\nimport { auth } from \"@clerk\u002Fnextjs\u002Fserver\";\n\nexport async function GET() {\n  const { userId } = await auth();\n  if (!userId) {\n    return Response.json({ error: \"Unauthorized\" }, { status: 401 });\n  }\n  return Response.json({ userId });\n}\n```\n\n## Descope\n\nDescope is available on the Vercel Marketplace with native integration support.\n\n### Install via Marketplace\n\n```bash\nvercel integration add descope\n```\n\n### SDK Setup\n\n```bash\nnpm install @descope\u002Fnextjs-sdk\n```\n\n### Provider and Middleware\n\n```tsx\n\u002F\u002F app\u002Flayout.tsx\nimport { AuthProvider } from \"@descope\u002Fnextjs-sdk\";\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  return (\n    \u003CAuthProvider projectId={process.env.NEXT_PUBLIC_DESCOPE_PROJECT_ID!}>\n      \u003Chtml lang=\"en\">\n        \u003Cbody>{children}\u003C\u002Fbody>\n      \u003C\u002Fhtml>\n    \u003C\u002FAuthProvider>\n  );\n}\n```\n\n```ts\n\u002F\u002F middleware.ts\nimport { authMiddleware } from \"@descope\u002Fnextjs-sdk\u002Fserver\";\n\nexport default authMiddleware({\n  projectId: process.env.DESCOPE_PROJECT_ID!,\n  publicRoutes: [\"\u002F\", \"\u002Fsign-in\"],\n});\n```\n\n### Sign-In Flow\n\n```tsx\n\"use client\";\nimport { Descope } from \"@descope\u002Fnextjs-sdk\";\n\nexport default function SignInPage() {\n  return \u003CDescope flowId=\"sign-up-or-in\" \u002F>;\n}\n```\n\n## Auth0\n\nAuth0 provides a mature authentication platform with extensive identity provider support.\n\n### SDK Setup\n\n```bash\nnpm install @auth0\u002Fnextjs-auth0\n```\n\n### Configuration\n\n```ts\n\u002F\u002F lib\u002Fauth0.ts\nimport { Auth0Client } from \"@auth0\u002Fnextjs-auth0\u002Fserver\";\n\nexport const auth0 = new Auth0Client();\n```\n\nRequired environment variables:\n\n```env\nAUTH0_SECRET=\u003Crandom-secret>\nAUTH0_BASE_URL=http:\u002F\u002Flocalhost:3000\nAUTH0_ISSUER_BASE_URL=https:\u002F\u002Fyour-tenant.auth0.com\nAUTH0_CLIENT_ID=\u003Cclient-id>\nAUTH0_CLIENT_SECRET=\u003Cclient-secret>\n```\n\n### Middleware\n\n```ts\n\u002F\u002F middleware.ts\nimport { auth0 } from \"@\u002Flib\u002Fauth0\";\nimport { NextRequest, NextResponse } from \"next\u002Fserver\";\n\nexport async function middleware(request: NextRequest) {\n  return await auth0.middleware(request);\n}\n\nexport const config = {\n  matcher: [\n    \"\u002F((?!_next\u002Fstatic|_next\u002Fimage|favicon.ico|sitemap.xml|robots.txt).*)\",\n  ],\n};\n```\n\n### Access Session Data\n\n```tsx\n\u002F\u002F Server component\nimport { auth0 } from \"@\u002Flib\u002Fauth0\";\n\nexport default async function Page() {\n  const session = await auth0.getSession();\n  return session ? (\n    \u003Cp>Hello, {session.user.name}\u003C\u002Fp>\n  ) : (\n    \u003Ca href=\"\u002Fauth\u002Flogin\">Log in\u003C\u002Fa>\n  );\n}\n```\n\n## Decision Matrix\n\n| Need | Recommended | Why |\n|------|------------|-----|\n| Fastest setup on Vercel | Clerk | Native Marketplace, auto-provisioned env vars |\n| Passwordless \u002F social login flows | Descope | Visual flow builder, Marketplace native |\n| Enterprise SSO \u002F SAML \u002F multi-tenant | Auth0 | Deep enterprise identity support |\n| Pre-built UI components | Clerk | Drop-in `\u003CSignIn \u002F>`, `\u003CUserButton \u002F>` |\n| Vercel unified billing | Clerk or Descope | Both are native Marketplace integrations |\n\n## Clerk Core 3 Breaking Changes (March 2026)\n\nClerk provides an upgrade CLI that scans your codebase and applies codemods: `npx @clerk\u002Fupgrade`. Requires **Node.js 20.9.0+**.\n\n- **`auth()` is async** — always use `const { userId } = await auth()`, not synchronous\n- **`auth.protect()` moved** — use `await auth.protect()` directly, not from the return value of `auth()`\n- **`clerkClient()` is async** — use `await clerkClient()` in middleware handlers\n- **`authMiddleware()` removed** — migrate to `clerkMiddleware()`\n- **`@clerk\u002Ftypes` deprecated** — import types from SDK subpath exports: `import type { UserResource } from '@clerk\u002Freact\u002Ftypes'` (works from any SDK package)\n- **`ClerkProvider` no longer forces dynamic rendering** — pass the `dynamic` prop if needed\n- **Cache components** — when using Next.js cache components, place `\u003CClerkProvider>` inside `\u003Cbody>`, not wrapping `\u003Chtml>`\n- **Satellite domains** — new `satelliteAutoSync` option skips handshake redirects when no session cookies exist\n- **Smaller bundles** — React is now shared across framework SDKs (~50KB gzipped savings)\n- **Better offline handling** — `getToken()` now correctly distinguishes signed-out from offline states\n\n## Cross-References\n\n- **Marketplace install and env var provisioning** → `⤳ skill: marketplace`\n- **Middleware routing patterns** → `⤳ skill: routing-middleware`\n- **Environment variable management** → `⤳ skill: env-vars`\n- **Vercel OAuth (Sign in with Vercel)** → `⤳ skill: sign-in-with-vercel`\n\n## Official Documentation\n\n- [Clerk + Vercel Marketplace](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fdeployments\u002Fvercel)\n- [Clerk Next.js Quickstart](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fquickstarts\u002Fnextjs)\n- [Descope Next.js SDK](https:\u002F\u002Fdocs.descope.com\u002Fgetting-started\u002Fnextjs)\n- [Auth0 Next.js SDK](https:\u002F\u002Fauth0.com\u002Fdocs\u002Fquickstart\u002Fwebapp\u002Fnextjs)\n",{"name":5,"chainTo":43,"metadata":66,"validate":100,"retrieval":106,"description":7},[44,48,52,55,58,62],{"message":45,"pattern":46,"targetSkill":47},"Hand-rolled Vercel OAuth detected — loading Sign in with Vercel OIDC guidance.","VERCEL_CLIENT_(ID|SECRET)|vercel\\.com\u002Foauth\u002F(authorize|access_token|token)","sign-in-with-vercel",{"message":49,"pattern":50,"targetSkill":51},"Auth logic in middleware.ts — loading Routing Middleware guidance for proxy.ts migration in Next.js 16.","export\\s+(default\\s+)?function\\s+middleware","routing-middleware",{"message":53,"pattern":54,"targetSkill":5},"Manual JWT handling with jsonwebtoken detected — use Clerk or Auth.js for managed auth with built-in JWT session handling, CSRF protection, and token rotation.","from\\s+['\\\"](jsonwebtoken)['\"]|require\\s*\\(\\s*['\\\"](jsonwebtoken)['\"]|jwt\\.sign\\s*\\(",{"message":56,"pattern":57,"targetSkill":5},"Legacy next-auth (v4) pattern detected — loading auth guidance for Auth.js v5 migration with the new universal auth() helper.","from\\s+['\\\"](next-auth)['\"]|NextAuthOptions|authOptions\\s*:",{"message":59,"pattern":60,"targetSkill":5,"skipIfFileContains":61},"Clerk import detected — loading Auth guidance for Clerk v7 patterns, middleware setup, organization handling, and Vercel Marketplace integration.","from\\s+['\"]@clerk\u002Fnextjs['\"]","clerkMiddleware|ClerkProvider",{"message":63,"pattern":64,"targetSkill":5,"skipIfFileContains":65},"Manual password hashing detected (bcrypt\u002Fargon2) — use Clerk or Auth0 for managed authentication with built-in password hashing, rate limiting, and breach detection.","bcrypt|argon2","@clerk|@auth0",{"docs":67,"sitemap":70,"priority":71,"bashPatterns":72,"pathPatterns":85},[68,69],"https:\u002F\u002Fauthjs.dev\u002Fgetting-started","https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fbuilding-your-application\u002Fauthentication","https:\u002F\u002Fauthjs.dev\u002Fsitemap.xml",6,[73,74,75,76,77,78,79,80,81,82,83,84],"\\bnpm\\s+(install|i|add)\\s+[^\\n]*@clerk\u002Fnextjs\\b","\\bpnpm\\s+(install|i|add)\\s+[^\\n]*@clerk\u002Fnextjs\\b","\\bbun\\s+(install|i|add)\\s+[^\\n]*@clerk\u002Fnextjs\\b","\\byarn\\s+add\\s+[^\\n]*@clerk\u002Fnextjs\\b","\\bnpm\\s+(install|i|add)\\s+[^\\n]*@descope\u002Fnextjs-sdk\\b","\\bpnpm\\s+(install|i|add)\\s+[^\\n]*@descope\u002Fnextjs-sdk\\b","\\bbun\\s+(install|i|add)\\s+[^\\n]*@descope\u002Fnextjs-sdk\\b","\\byarn\\s+add\\s+[^\\n]*@descope\u002Fnextjs-sdk\\b","\\bnpm\\s+(install|i|add)\\s+[^\\n]*@auth0\u002Fnextjs-auth0\\b","\\bpnpm\\s+(install|i|add)\\s+[^\\n]*@auth0\u002Fnextjs-auth0\\b","\\bbun\\s+(install|i|add)\\s+[^\\n]*@auth0\u002Fnextjs-auth0\\b","\\byarn\\s+add\\s+[^\\n]*@auth0\u002Fnextjs-auth0\\b",[86,87,88,89,90,91,92,93,94,95,96,97,98,99],"middleware.ts","middleware.js","src\u002Fmiddleware.ts","src\u002Fmiddleware.js","clerk.config.*","app\u002Fsign-in\u002F**","app\u002Fsign-up\u002F**","src\u002Fapp\u002Fsign-in\u002F**","src\u002Fapp\u002Fsign-up\u002F**","app\u002F(auth)\u002F**","src\u002Fapp\u002F(auth)\u002F**","auth.config.*","auth.ts","auth.js",[101],{"message":102,"pattern":46,"severity":103,"upgradeWhy":104,"upgradeToSkill":47,"skipIfFileContains":105},"Hand-rolled Vercel OAuth detected. Use the dedicated Sign in with Vercel skill for OIDC-based Vercel identity.","recommended","Replace manual Vercel OAuth token exchange with the Sign in with Vercel OIDC provider.","signInWithVercel|@vercel\u002Fauth",{"aliases":107,"intents":111,"entities":117,"examples":125},[34,108,109,110],"login system","sign in","auth flow",[112,113,114,115,116],"add auth","protect routes","manage sessions","implement login","secure api endpoints",[118,119,120,121,122,123,124],"NextAuth","Auth.js","JWT","OAuth","session","middleware","getServerSession",[126,127,128],"add login to my app","protect this route with auth","set up NextAuth","main","9a4409c8751439c3aeeea2bc3940ba05dc3cd3b5","plugins\u002Fvercel\u002Fskills\u002Fauth",0,"https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins","https:\u002F\u002Fgithub.com\u002FNagyVikt","https:\u002F\u002Fwebu.hu\u002F","Codex is a tool they said...\r\n\r\nCreator of GitGuardex, CueCards. Tech stack: Next.js · TypeScript · Rust · Linux. ","2026-03-30 02:19:53",{"source":8,"skillName":5,"commands":139,"prompt":149,"zipAvailable":150},[140,143,146],{"tool":141,"command":142},"npx","npx skills add NagyVikt\u002Fcodex-plugins --skill auth",{"tool":144,"command":145},"bunx","bunx skills add NagyVikt\u002Fcodex-plugins --skill auth",{"tool":147,"command":148},"pnpm","pnpm dlx skills add NagyVikt\u002Fcodex-plugins --skill auth","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fauth\u002FSKILL.md",true,[],[153,195,226,247,276,298],{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":175,"publishedAt":38},"01M6K1ZEN8P9R2S6NPNJNJ8JVH","workflow","Vercel Workflow DevKit (WDK) expert guidance. Use when building durable workflows, long-running tasks, API routes or agents that need pause\u002Fresume, retries, step-based execution, or crash-safe orchestration with Vercel Workflow.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fworkflow\u002FSKILL.md",[159,164,167,172],{"categoryNo":160,"categoryName":161,"taxonomyType":162,"taxonomyTypeDesc":163},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":165,"categoryName":166,"taxonomyType":162,"taxonomyTypeDesc":163},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":168,"categoryName":169,"taxonomyType":170,"taxonomyTypeDesc":171},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":173,"categoryName":174,"taxonomyType":170,"taxonomyTypeDesc":171},"01JBSEEDCAT000000000000038","人力资源",[155,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194],"workflows","create","run","streaming","logs","start","why","loop","wait for","branch","auto","log","conversation","human","lib","condition","rendering","retries","sleep",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":211,"publishedAt":38},"01M6K1Z71NWFSPHK2VJJ73MVSY","verification","Full-story verification — infers what the user is building, then verifies the complete flow end-to-end: browser → API → data → response. Triggers on dev server start and 'why isn't this working' signals.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fverification\u002FSKILL.md",[201,204,205,208],{"categoryNo":202,"categoryName":203,"taxonomyType":162,"taxonomyTypeDesc":163},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":160,"categoryName":161,"taxonomyType":162,"taxonomyTypeDesc":163},{"categoryNo":206,"categoryName":207,"taxonomyType":170,"taxonomyTypeDesc":171},"01JBSEEDCAT000000000000031","产品经理",{"categoryNo":209,"categoryName":210,"taxonomyType":170,"taxonomyTypeDesc":171},"01JBSEEDCAT000000000000033","数据分析师",[197,5,179,212,213,214,185,215,216,217,218,219,220,19,221,222,223,123,224,225],"routing middleware","api","projects","user story","full stack","jest","local","project","end","false","unit","error","loading","unit test",{"skillNo":227,"name":228,"nameZh":6,"description":229,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":230,"categories":231,"keywords":233,"publishedAt":38},"01M6K1YPRYJS3BQEDP8HKBHPEJ","vercel-storage","Vercel storage expert guidance — Blob, Edge Config, and Marketplace storage (Neon Postgres, Upstash Redis). Use when choosing, configuring, or using data storage with Vercel applications.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-storage\u002FSKILL.md",[232],{"categoryNo":160,"categoryName":161,"taxonomyType":162,"taxonomyTypeDesc":163},[234,235,236,37,178,237,238,186,239,31,240,241,242,243,19,190,244,245,246,24],"storage","vercel storage","vercel","supabase","migrate","router","expert","prisma","connection pooling","neon","turso","upstash","URL",{"skillNo":248,"name":249,"nameZh":6,"description":250,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":251,"categories":252,"keywords":260,"publishedAt":38},"01M6K1YFEP0GPPGMQ3D0FPTS27","vercel-services","Vercel Services — deploy multiple services within a single Vercel project. Use for monorepo layouts or when combining a backend (Python, Go) with a frontend (Next.js, Vite) in one deployment.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-services\u002FSKILL.md",[253,256,257],{"categoryNo":254,"categoryName":255,"taxonomyType":162,"taxonomyTypeDesc":163},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":160,"categoryName":161,"taxonomyType":162,"taxonomyTypeDesc":163},{"categoryNo":258,"categoryName":259,"taxonomyType":162,"taxonomyTypeDesc":163},"01JBSEEDCAT000000000000011","运维与部署",[261,262,236,263,264,265,266,267,268,269,270,129,271,272,219,273,19,274,223,275],"vercel services","services","frontend","docker compose","SET","configure","monorepo","go api","fastapi","up","aws lambda","go backend","get","apps","python backend",{"skillNo":277,"name":278,"nameZh":6,"description":279,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":280,"categories":281,"keywords":282,"publishedAt":38},"01M6K1Y8S3CRD43DPKX0PK1MTT","vercel-sandbox","Vercel Sandbox guidance — ephemeral Firecracker microVMs for running untrusted code safely. Supports AI agents, code generation, and experimentation. Use when executing user-generated or AI-generated code in isolation.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-sandbox\u002FSKILL.md",[],[283,284,236,285,286,177,178,287,288,289,290,291,292,293,294,295,224,296,278,297],"sandbox","vercel sandbox","safe","ai agents","code","ai sdk","Code Generation","playground","generated","spawn","install","runner","io","child","student",{"skillNo":299,"name":300,"nameZh":6,"description":301,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":302,"categories":303,"keywords":305,"publishedAt":38},"01M6K1Y1J8S7AN97H75SHBGF7J","vercel-queues","Vercel Queues guidance (public beta) — durable event streaming with topics, consumer groups, retries, and delayed delivery. $0.60\u002F1M ops. Powers Workflow DevKit. Use when building async processing, fan-out patterns, or event-driven architectures.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-queues\u002FSKILL.md",[304],{"categoryNo":165,"categoryName":166,"taxonomyType":162,"taxonomyTypeDesc":163},[306,236,155,176,179,307,265,213,266,270,308,309,310,311,19,190,312,193,224,313],"vercel queues","beta","message","delivery","across","worker","processing","at"]