mcpField
C
clerk-react-patterns

clerk-react-patterns

github.com/clerk開発8919.8k 回インストール今日更新
リポジトリ

clerk-react-patterns について

Vite/CRA のシングルページアプリ向け Clerk React 認証スキルです。フック、ルート保護、カスタムのサインインフローに加え、クライアント側の認証状態やトークンの扱いを説明します。

主な機能

  1. 01認証フックの使い方
  2. 02React Router のルート保護
  3. 03カスタムのサインイン・登録フロー
  4. 04セッション JWT の取得
  5. 05読み込み状態と注意点の説明

活用シーン

  1. 01React 画面でユーザーと認証状態を参照
  2. 02サインイン済みユーザーにルートを制限
  3. 03カスタムのサインイン・登録画面を作成
  4. 04API リクエスト用のセッショントークンを取得

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/clerk/skills --skill clerk-react-patterns

インストール後、Claude Code で/clerk-react-patternsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
evals.json
references/
custom-flows.md
hooks.md
protected-routes.md
router-integration.md
templates/react-basic-auth/
index.html
package.json
tsconfig.json
vite.config.ts
templates/react-basic-auth/src/
App.tsx
main.tsx

詳細

React SPA パターン

このスキルでは、Vite/CRA の SPA 向けに @clerk/react を扱います。Next.js では clerk-nextjs-patterns を使用してください。TanStack Start では clerk-tanstack-patterns を使用してください。

何が必要ですか?

タスクリファレンス
useAuth/useUser/useClerk フックreferences/hooks.md
React Router を使った保護されたルートreferences/protected-routes.md
カスタムのサインイン/サインアップフォームreferences/custom-flows.md
React Router v6/v7 の統合references/router-integration.md

リファレンス

リファレンス説明
references/hooks.mduseAuth、isLoaded ガード
references/protected-routes.mdProtectedRoute パターン
references/custom-flows.mduseSignIn、useSignUp のフロー
references/router-integration.mdReact Router v6/v7 のセットアップ

セットアップ

npm install @clerk/react

.env:

VITE_CLERK_PUBLISHABLE_KEY=pk_...

src/main.tsx:

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { ClerkProvider } from '@clerk/react'
import App from './App.tsx'

const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <ClerkProvider publishableKey={PUBLISHABLE_KEY}>
      <App />
    </ClerkProvider>
  </StrictMode>,
)

基本的な考え方

@clerk/react はクライアント専用です。サーバー側の auth() はありません。すべての認証状態はフックから取得します。

  • isSignedIn を信頼する前に、isLoaded が true であることを確認する必要があります。必ず isLoaded をチェックしてください
  • useClerk() を使うと、signOut、openSignIn、openUserProfile などのメソッドにアクセスできます
  • useAuth() の getToken() は、API 呼び出し用のセッション JWT を取得します

最小パターン

import { useAuth } from '@clerk/react'

export function Dashboard() {
  const { isLoaded, isSignedIn, userId } = useAuth()

  if (!isLoaded) return <div>Loading...</div>
  if (!isSignedIn) return <div>Please sign in</div>

  return <div>Hello {userId}</div>
}

保護されたルート(React Router v6/v7)

import { Navigate, Outlet } from 'react-router-dom'
import { useAuth } from '@clerk/react'

export function ProtectedRoute() {
  const { isLoaded, isSignedIn } = useAuth()

  if (!isLoaded) return <div>Loading...</div>
  if (!isSignedIn) return <Navigate to="/sign-in" replace />

  return <Outlet />
}
<Routes>
  <Route element={<ProtectedRoute />}>
    <Route path="/dashboard" element={<Dashboard />} />
    <Route path="/settings" element={<Settings />} />
  </Route>
  <Route path="/sign-in" element={<SignIn />} />
</Routes>

API 呼び出し用のトークン

import { useAuth } from '@clerk/react'

export function DataFetcher() {
  const { getToken } = useAuth()

  async function fetchData() {
    const token = await getToken()
    if (!token) return

    const res = await fetch('/api/data', {
      headers: { Authorization: `Bearer ${token}` },
    })
    return res.json()
  }

  return <button onClick={fetchData}>Load</button>
}

よくある問題

症状原因対処方法
isSignedIn が undefinedisLoaded がまだ false必ず最初に isLoaded をチェックします
ClerkProvider がないProvider がルートに設定されていないmain.tsx で <App> をラップします
環境変数が未定義Vite のプレフィックスが間違っているVITE_CLERK_PUBLISHABLE_KEY を使い、import.meta.env からアクセスします
トークンが nullユーザーがサインインしていないgetToken() の結果が null でないことを確認します
サインインコンポーネントが空白になるProvider に publishableKey がないpublishableKey を明示的に渡します

関連項目

  • clerk-setup - Clerk の初期インストール
  • clerk-custom-ui - カスタムフローと外観
  • clerk-orgs - B2B 組織

ドキュメント

React SDK

コメント