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. 01在 React 页面读取用户与认证状态
  2. 02限制未登录用户访问路由
  3. 03构建自定义登录或注册界面
  4. 04为 API 请求获取会话令牌

安装

复制下面的命令,在终端中运行。

$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
缺少 ClerkProviderProvider 未位于根节点在 main.tsx 中用 <App> 包裹
环境变量未定义Vite 前缀错误使用 VITE_CLERK_PUBLISHABLE_KEY,通过 import.meta.env 访问
令牌为 null用户未登录对 getToken() 的结果进行空值检查
登录组件显示空白Provider 上没有 publishableKey显式传入 publishableKey

另请参阅

  • clerk-setup - Clerk 初始安装
  • clerk-custom-ui - 自定义流程和外观
  • clerk-orgs - B2B 组织

文档

React SDK

评论

支持 Markdown