clerk-tanstack-patterns について
TanStack React Start に Clerk 認証を組み込む開発者向けのパターン集です。サーバー関数やルートでの認証処理、ミドルウェア設定を扱います。
主な機能
- 01認証付きルートガードとリダイレクト
- 02サーバー関数での認証状態取得
- 03ローダーへの認証コンテキスト受け渡し
- 04Vite と Clerk ミドルウェアの設定
活用シーン
- 01サインイン必須ルートの保護
- 02サーバー関数でのユーザー確認
- 03ルートローダーへの userId 受け渡し
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ clerk/ skills --skill clerk-tanstack-patternsインストール後、Claude Code で/clerk-tanstack-patternsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/loaders.mdrouter-guards.mdserver-functions.mdserver-setup.mdtemplates/tanstack-basic-auth/package.jsontsconfig.jsonvite.config.tstemplates/tanstack-basic-auth/src/router.tsxstart.tstemplates/tanstack-basic-auth/src/routes/__root.tsxindex.tsx詳細
TanStack React Start のパターン
必要な情報はどれですか?
| タスク | リファレンス |
|---|---|
| beforeLoad でルートを保護する | references/router-guards.md |
| createServerFn で認証する | references/server-functions.md |
| ローダーに認証情報を渡す | references/loaders.md |
| Vite と Clerk ミドルウェアを設定する | references/server-setup.md |
リファレンス
| リファレンス | 説明 |
|---|---|
references/router-guards.md | beforeLoad による認証リダイレクト |
references/server-functions.md | auth() を使った createServerFn |
references/loaders.md | ローダーの認証コンテキスト |
references/server-setup.md | Vite とリクエストミドルウェアの設定 |
セットアップ
npm install @clerk/tanstack-react-start
.env:
VITE_CLERK_PUBLISHABLE_KEY=pk_...
CLERK_SECRET_KEY=sk_...
src/start.ts(リクエストミドルウェア):
import { clerkMiddleware } from '@clerk/tanstack-react-start/server'
import { createCsrfMiddleware, createStart } from '@tanstack/react-start'
const csrfMiddleware = createCsrfMiddleware({
filter: (ctx) => ctx.handlerType === 'serverFn',
})
export const startInstance = createStart(() => {
return {
requestMiddleware: [csrfMiddleware, clerkMiddleware()],
}
})
src/routes/__root.tsx — <ClerkProvider> でラップします:
import { ClerkProvider } from '@clerk/tanstack-react-start'
function RootDocument({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<ClerkProvider>
{children}
</ClerkProvider>
</body>
</html>
)
}
基本的な考え方
TanStack Start は tanstackStart() Vite プラグインを使用します。src/start.ts では Clerk リクエストミドルウェアより前に CSRF 保護を登録します。認証は次の 2 つのレイヤーを通じて行われます。
- サーバーレイヤー —
@clerk/tanstack-react-start/serverのcreateServerFnとauth() - ルーターレイヤー — ルート定義の
beforeLoad。未認証の場合はredirectをスローします
どちらのレイヤーもサーバー上で実行されます。クライアントフック(useAuth、useUser)はブラウザー側で使用する React フックです。
最小限のパターン
import { createFileRoute, redirect } from '@tanstack/react-router'
import { createServerFn } from '@tanstack/react-start'
import { auth } from '@clerk/tanstack-react-start/server'
const authStateFn = createServerFn().handler(async () => {
const { isAuthenticated, userId } = await auth()
if (!isAuthenticated) {
throw redirect({ to: '/sign-in' })
}
return { userId }
})
export const Route = createFileRoute('/dashboard')({
beforeLoad: async () => await authStateFn(),
})
よくある問題
| 症状 | 原因 | 対処法 |
|---|---|---|
auth() が「without configuring the middleware」エラーをスローする | start.ts に clerkMiddleware がない | requestMiddleware の CSRF ミドルウェアの後に追加します |
redirect がスローされない | throw ではなく return を使用している | TanStack では throw redirect(...) を使用します |
auth のインポート先が違う | クライアントとサーバーのインポートが混在している | サーバー: @clerk/tanstack-react-start/server |
| ローダーのコンテキストに userId がない | beforeLoad から渡していない | beforeLoad から返し、context 経由でアクセスします |
ClerkProvider がない | ルートのラップを忘れている | シェルコンポーネントの __root.tsx に追加します |
関連項目
clerk-setup- Clerk の初期インストールclerk-custom-ui- カスタムフローと外観clerk-orgs- B2B 組織
ドキュメント
コメント
Markdown 対応