Claude-skill-registry clerk-common-errors

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/clerk-common-errors" ~/.claude/skills/majiayu000-claude-skill-registry-clerk-common-errors && rm -rf "$T"
manifest: skills/data/clerk-common-errors/SKILL.md
source content

Clerk Common Errors

Overview

Diagnose and resolve common Clerk authentication errors and issues.

Prerequisites

  • Clerk SDK installed
  • Access to Clerk dashboard for configuration checks
  • Browser developer tools for debugging

Instructions

Error Category 1: Configuration Errors

Invalid API Key

Error: Clerk: Invalid API key

Cause: Publishable or secret key is incorrect or mismatched. Solution:

# Verify keys in .env.local match Clerk dashboard
# Publishable key starts with pk_test_ or pk_live_
# Secret key starts with sk_test_ or sk_live_

# Check for trailing whitespace
cat -A .env.local | grep CLERK

# Ensure correct environment
echo $NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY

ClerkProvider Not Found

Error: useAuth can only be used within the <ClerkProvider /> component

Cause: Component using Clerk hooks is outside ClerkProvider. Solution:

// Ensure ClerkProvider wraps entire app in layout.tsx
import { ClerkProvider } from '@clerk/nextjs'

export default function RootLayout({ children }) {
  return (
    <ClerkProvider>
      <html><body>{children}</body></html>
    </ClerkProvider>
  )
}

Error Category 2: Authentication Errors

Session Not Found

Error: Session not found

Cause: User session expired or was revoked. Solution:

// Handle gracefully in your app
const { userId } = await auth()
if (!userId) {
  redirect('/sign-in')
}

Form Identifier Not Found

Error: form_identifier_not_found

Cause: Email/username not registered. Solution:

// Show helpful message to user
catch (err: any) {
  if (err.errors?.[0]?.code === 'form_identifier_not_found') {
    setError('No account found with this email. Please sign up.')
  }
}

Password Incorrect

Error: form_password_incorrect

Cause: Wrong password entered. Solution:

catch (err: any) {
  if (err.errors?.[0]?.code === 'form_password_incorrect') {
    setError('Incorrect password. Try again or reset your password.')
  }
}

Error Category 3: Middleware Errors

Infinite Redirect Loop

Error: Too many redirects

Cause: Middleware matcher includes sign-in page. Solution:

// middleware.ts
const isPublicRoute = createRouteMatcher([
  '/sign-in(.*)',  // Must include sign-in pages
  '/sign-up(.*)',
  '/'
])

export default clerkMiddleware(async (auth, request) => {
  if (!isPublicRoute(request)) {
    await auth.protect()
  }
})

Middleware Not Executing

Error: Routes not protected

Cause: Matcher not matching routes correctly. Solution:

export const config = {
  matcher: [
    // Skip static files and _next
    '/((?!_next|[^?]*\\.(?:html?|css|js|jpe?g|webp|png|gif|svg|ttf|woff2?|ico)).*)',
    '/',
    '/(api|trpc)(.*)'
  ]
}

Error Category 4: Server/Client Errors

Hydration Mismatch

Error: Text content does not match server-rendered HTML

Cause: Auth state differs between server and client. Solution:

'use client'
import { useUser } from '@clerk/nextjs'

export function UserGreeting() {
  const { user, isLoaded } = useUser()

  // Prevent hydration mismatch by waiting for load
  if (!isLoaded) {
    return <div>Loading...</div>
  }

  return <div>Hello, {user?.firstName}</div>
}

Cannot Read Properties of Undefined

Error: Cannot read properties of undefined (reading 'userId')

Cause: Using auth() in client component or non-server context. Solution:

// Server Component - use auth()
import { auth } from '@clerk/nextjs/server'
const { userId } = await auth()

// Client Component - use useAuth()
'use client'
import { useAuth } from '@clerk/nextjs'
const { userId } = useAuth()

Error Category 5: Webhook Errors

Webhook Verification Failed

Error: Webhook signature verification failed

Cause: Incorrect webhook secret or missing headers. Solution:

// app/api/webhooks/clerk/route.ts
import { Webhook } from 'svix'
import { headers } from 'next/headers'

export async function POST(req: Request) {
  const WEBHOOK_SECRET = process.env.CLERK_WEBHOOK_SECRET!

  const headerPayload = await headers()
  const svix_id = headerPayload.get('svix-id')
  const svix_timestamp = headerPayload.get('svix-timestamp')
  const svix_signature = headerPayload.get('svix-signature')

  const body = await req.text()

  const wh = new Webhook(WEBHOOK_SECRET)
  const evt = wh.verify(body, {
    'svix-id': svix_id!,
    'svix-timestamp': svix_timestamp!,
    'svix-signature': svix_signature!
  })

  // Process event
}

Output

  • Identified error category
  • Root cause analysis
  • Working solution code

Diagnostic Commands

# Check Clerk version
npm list @clerk/nextjs

# Verify environment variables
npx next info

# Check for multiple Clerk instances
npm list | grep clerk

# Clear Next.js cache
rm -rf .next && npm run dev

Quick Reference Table

Error CodeMeaningQuick Fix
form_identifier_not_found
User doesn't existShow sign-up link
form_password_incorrect
Wrong passwordShow reset link
session_exists
Already logged inRedirect to app
verification_expired
Code expiredResend code
rate_limit_exceeded
Too many attemptsWait and retry

Resources

Next Steps

Proceed to

clerk-debug-bundle
for comprehensive debugging tools.