home / skills / jeremylongshore / claude-code-plugins-plus-skills / clerk-hello-world

This skill helps you verify Clerk integration by making a first authenticated request and testing protected routes end to end.

npx playbooks add skill jeremylongshore/claude-code-plugins-plus-skills --skill clerk-hello-world

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
3.8 KB
---
name: clerk-hello-world
description: |
  Create your first authenticated request with Clerk.
  Use when making initial API calls, testing authentication,
  or verifying Clerk integration works correctly.
  Trigger with phrases like "clerk hello world", "first clerk request",
  "test clerk auth", "verify clerk setup".
allowed-tools: Read, Write, Edit, Bash(npm:*), Grep
version: 1.0.0
license: MIT
author: Jeremy Longshore <[email protected]>
---

# Clerk Hello World

## Overview
Make your first authenticated request using Clerk to verify the integration works.

## Prerequisites
- Clerk SDK installed (`clerk-install-auth` completed)
- Environment variables configured
- ClerkProvider wrapping application

## Instructions

### Step 1: Create Protected Page
```typescript
// app/dashboard/page.tsx
import { auth, currentUser } from '@clerk/nextjs/server'

export default async function DashboardPage() {
  const { userId } = await auth()
  const user = await currentUser()

  if (!userId) {
    return <div>Please sign in to access this page</div>
  }

  return (
    <div>
      <h1>Hello, {user?.firstName || 'User'}!</h1>
      <p>Your user ID: {userId}</p>
      <p>Email: {user?.emailAddresses[0]?.emailAddress}</p>
    </div>
  )
}
```

### Step 2: Create Protected API Route
```typescript
// app/api/hello/route.ts
import { auth } from '@clerk/nextjs/server'

export async function GET() {
  const { userId } = await auth()

  if (!userId) {
    return Response.json({ error: 'Unauthorized' }, { status: 401 })
  }

  return Response.json({
    message: 'Hello from Clerk!',
    userId,
    timestamp: new Date().toISOString()
  })
}
```

### Step 3: Test Authentication Flow
```typescript
// Client-side test component
'use client'
import { useUser, useAuth } from '@clerk/nextjs'

export function AuthTest() {
  const { user, isLoaded, isSignedIn } = useUser()
  const { getToken } = useAuth()

  if (!isLoaded) return <div>Loading...</div>
  if (!isSignedIn) return <div>Not signed in</div>

  const testAPI = async () => {
    const token = await getToken()
    const res = await fetch('/api/hello', {
      headers: { Authorization: `Bearer ${token}` }
    })
    console.log(await res.json())
  }

  return (
    <div>
      <p>Signed in as: {user.primaryEmailAddress?.emailAddress}</p>
      <button onClick={testAPI}>Test API</button>
    </div>
  )
}
```

## Output
- Protected page showing user information
- API route returning authenticated user data
- Successful request/response verification

## Error Handling
| Error | Cause | Solution |
|-------|-------|----------|
| userId is null | User not authenticated | Redirect to sign-in or check middleware |
| currentUser returns null | Session expired | Refresh page or re-authenticate |
| 401 Unauthorized | Token missing or invalid | Check Authorization header |
| Hydration Error | Server/client mismatch | Use 'use client' for client hooks |

## Examples

### Using with React Hooks
```typescript
'use client'
import { useUser, useClerk } from '@clerk/nextjs'

export function UserProfile() {
  const { user } = useUser()
  const { signOut } = useClerk()

  return (
    <div>
      <img src={user?.imageUrl} alt="Profile" />
      <h2>{user?.fullName}</h2>
      <button onClick={() => signOut()}>Sign Out</button>
    </div>
  )
}
```

### Express.js Example
```typescript
import { clerkMiddleware, requireAuth } from '@clerk/express'

app.use(clerkMiddleware())

app.get('/api/protected', requireAuth(), (req, res) => {
  res.json({
    message: 'Hello!',
    userId: req.auth.userId
  })
})
```

## Resources
- [Clerk Auth Object](https://clerk.com/docs/references/nextjs/auth)
- [Clerk Hooks](https://clerk.com/docs/references/react/use-user)
- [Protected Routes](https://clerk.com/docs/references/nextjs/auth-middleware)

## Next Steps
Proceed to `clerk-local-dev-loop` for local development workflow setup.

Overview

This skill helps you make your first authenticated request with Clerk to verify that your integration and authentication flow work. It provides a minimal protected page, a protected API route, and a client-side test component to exercise token issuance and authorization. Use it to confirm environment variables, ClerkProvider wrapping, and SDK setup are correct.

How this skill works

The skill shows how to protect a server-rendered page and an API route using Clerk's server auth helpers, returning user data only when a valid session exists. It also includes a client-side component that retrieves a session token and calls the protected API with an Authorization header to validate the request/response cycle. Error cases and common causes are documented so you can quickly identify and fix failures.

When to use it

  • Onboarding Clerk into a new app to verify authentication is functioning
  • Testing that environment variables and ClerkProvider are configured correctly
  • Debugging token issuance, protected API routes, or server-side auth checks
  • Demonstrating a minimal example to teammates or during code reviews
  • Validating sign-in, session expiration, and middleware behavior

Best practices

  • Wrap your app with ClerkProvider before rendering protected pages or hooks
  • Keep token retrieval on the client via getToken and send it in Authorization headers
  • Return 401 for unauthorized API calls and handle redirects for server pages
  • Use 'use client' for React components that call Clerk hooks to avoid hydration errors
  • Log minimal user info during tests, avoid exposing sensitive data in responses

Example use cases

  • Create a dashboard page that shows the signed-in user's name and email
  • Add a simple /api/hello endpoint that returns userId and timestamp for tests
  • Build a client test button that fetches the protected API using getToken
  • Integrate Clerk into an Express app using clerkMiddleware and requireAuth
  • Verify session refresh and re-authentication flows during development

FAQ

What if userId is null on the server?

A null userId means no active session; redirect to sign-in, verify middleware, or check that the request includes a valid session cookie.

Why do I get 401 Unauthorized from the API?

Confirm the client sends Authorization: Bearer <token> and that getToken returns a valid token. Verify environment variables and Clerk SDK initialization.

How do I avoid hydration errors when using Clerk hooks?

Mark client components with 'use client' and avoid calling client-only hooks in server components; fetch server-side auth via Clerk's server helpers instead.