mcpField
C
clerk-react-patterns

clerk-react-patterns

github.com/midudev開発7.0k58 回インストール1 週間前に更新
リポジトリ

clerk-react-patterns について

clerk-react-patterns は、Vite または CRA で構築する React シングルページアプリ向けの Clerk 統合スキルです。認証フック、保護ルート、カスタムのサインイン・サインアップ、React Router の設定を案内します。

主な機能

  1. 01認証・ユーザーフックの利用案内
  2. 02React Router の保護ルートパターン
  3. 03カスタムのサインイン・サインアップ
  4. 04セッション JWT の取得方法
  5. 05読み込み状態と設定の問題対処

活用シーン

  1. 01React SPA への Clerk 認証の追加
  2. 02サインイン状態に応じたルート制限
  3. 03API 呼び出し用セッショントークンの取得
  4. 04プロバイダーや環境変数設定の問題調査

インストール

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

$npx skills add https://github.com/midudev/autoskills --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

コメント