教程 / 后端集成 / 使用 Clerk 添加身份验证
📝 文字 ● 初级 更新于 2026-05-13

如何使用 Clerk 为应用添加身份验证?

TL;DR:在 clerk.com 注册账号,创建应用,安装 @clerk/nextjs(或对应框架的包),用 <ClerkProvider> 包裹应用,再放入 <SignIn /><UserButton />。免费套餐:10,000 月活用户。

放入 <SignIn /> 即可获得一个可用的认证界面。Clerk 负责处理密码、OAuth、MFA、会话、组织——你无需编写任何相关代码。免费套餐支持每月 10,000 名活跃用户。

什么时候选 Clerk(与其他方案的对比)

0
  • 选 Clerk 的场景——你希望认证界面开箱即用、外观精美,无需自行设计;需要原生支持组织/多租户;或者不想自己处理 session 刷新、CSRF 防护和 OAuth 流程。
  • Supabase Auth——如果你已经在用 Supabase 作为数据库,一次注册即可搞定,免费。
  • 手动接入 Google OAuth——如果你只需要一个登录渠道,不想依赖 UI 库,也没有月费预算上限的顾虑。
  • Auth0 ↗——适合企业级 SAML/SSO 及高合规性需求。

Clerk 的最佳场景:快速迭代的 SaaS 初创团队,想要做好认证但不想在上面花精力。

注册并创建应用

1

前往 dashboard.clerk.com ↗ 注册。免费套餐:每月 10,000 活跃用户,无需绑定信用卡。

创建一个应用,选择要开启的登录方式:

  • 邮箱 + 密码
  • 魔法链接(无密码登录)
  • 手机号(短信验证码)
  • Google、GitHub、Apple、Microsoft、Discord、Twitter、LinkedIn、Facebook 等——直接开关切换,Clerk 代为处理各社交平台的 OAuth 注册流程,你无需在对方平台配置 Client ID。

获取密钥

2

进入 Dashboard → API Keys,复制以下两个值:

NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_xxxxx
CLERK_SECRET_KEY=sk_test_xxxxx

Publishable Key 可以安全地暴露给浏览器;Secret Key 仅限后端使用。

安装并包裹应用

3

Next.js App Router(最常见):

npm install @clerk/nextjs

在项目根目录的 middleware.ts 中:

import { clerkMiddleware } from '@clerk/nextjs/server';

export default clerkMiddleware();

export const config = {
  matcher: ['/((?!_next|.*\\..*).*)', '/api/(.*)'],
};

app/layout.tsx 中:

import { ClerkProvider } from '@clerk/nextjs';

export default function RootLayout({ children }) {
  return (
    <ClerkProvider>
      <html><body>{children}</body></html>
    </ClerkProvider>
  );
}

完成。认证功能已贯通整个应用。

其他框架

4

以下框架同样遵循相同模式(Provider 组件 + middleware/服务端辅助函数):

嵌入登录界面

5

Clerk 提供开箱即用的预置组件。以 Next.js 为例:

// app/sign-in/[[...sign-in]]/page.tsx
import { SignIn } from '@clerk/nextjs';

export default function Page() {
  return <SignIn />;
}

这就是完整的登录页面。界面精美,并自动包含你在第 1 步开启的所有登录方式。<SignUp /><UserButton />(带账号管理的头像下拉菜单)和 <OrganizationSwitcher /> 的用法与此相同。

查看所有组件 ↗

保护页面

6
// app/dashboard/page.tsx
import { auth } from '@clerk/nextjs/server';
import { redirect } from 'next/navigation';

export default async function Dashboard() {
  const { userId } = await auth();
  if (!userId) redirect('/sign-in');

  return <div>Welcome to your dashboard</div>;
}

也可以在 middleware 中保护整组路由——匹配规则详见 clerkMiddleware 文档 ↗

在 API 中获取当前用户

7
// app/api/me/route.ts
import { auth, currentUser } from '@clerk/nextjs/server';

export async function GET() {
  const { userId } = await auth();
  if (!userId) return new Response('Unauthorized', { status: 401 });

  const user = await currentUser();
  return Response.json({
    email: user.emailAddresses[0].emailAddress,
    name: user.firstName,
  });
}

对于非 Next.js 框架:使用官方 Backend SDK 中的 JWT 验证 ↗

自定义界面样式

8

Clerk 组件的默认样式简洁大方,但偏向通用风格。若要与你的品牌一致:

<ClerkProvider appearance={{
  baseTheme: undefined,
  variables: {
    colorPrimary: '#6366f1',
    colorBackground: '#ffffff',
    borderRadius: '8px',
    fontFamily: '"DM Sans", system-ui, sans-serif',
  },
}}>
  ...
</ClerkProvider>

若需更深度定制(使用自己的组件),可采用 Clerk 的 Elements 原语 ↗——这是一套无样式的 headless 组件,你可以用自己的设计系统来包裹它。

多租户:组织管理

9

如果你的产品面向 B2B(每个用户属于一个或多个公司),可在 Dashboard 中启用组织功能:

Configure → Organizations → Enable。然后在界面中添加 <OrganizationSwitcher />——它为用户提供一个下拉菜单,方便在所属组织之间切换。

在服务端,当前组织的上下文可通过 auth() 获取:

const { userId, orgId, orgRole } = await auth();

内置角色:adminbasic_member。可在 Dashboard 中添加自定义权限。组织文档 ↗

Webhook:同步到你的数据库

10

Clerk 存储用户记录,你的数据库存储应用数据。要将两者关联,可监听 Clerk 的 webhook 事件:

Clerk Dashboard → Webhooks → New endpoint。选择要监听的事件(user.createduser.updateduser.deleted),获取签名密钥。

// app/api/webhooks/clerk/route.ts
import { Webhook } from 'svix';

export async function POST(req) {
  const payload = await req.text();
  const headers = Object.fromEntries(req.headers);
  const wh = new Webhook(process.env.CLERK_WEBHOOK_SECRET);
  const event = wh.verify(payload, headers);

  if (event.type === 'user.created') {
    await db.users.insert({
      clerk_id: event.data.id,
      email: event.data.email_addresses[0].email_address,
    });
  }
  return new Response('ok');
}

签名验证方式与 Stripe webhooks 相同。Clerk webhooks 文档 ↗

用户迁移:导入与导出

11

如果你已有用户表并希望导入:请参考 迁移指南 ↗。批量导入 API 支持常见格式的哈希密码(bcrypt、argon2、PBKDF2)。

如果你担心被供应商锁定:Clerk 支持随时导出全部用户和会话数据。迁移出去会有些麻烦,但完全可行。

上线前检查清单

12
  • 切换到生产实例——上线前在 Dashboard 中切换,开发环境与生产环境密钥分开管理。
  • 自定义域名——将认证页面托管在 auth.yourdomain.com,而非默认的 your-app.clerk.accounts.dev。免费,仅需一条 DNS 记录。
  • 启用 MFA——Configure → User & Authentication → Multi-factor。支持 TOTP、短信和备用码。
  • 机器人防护——开启即可。默认使用免费的 Cloudflare Turnstile。
  • 会话有效期——默认 7 天。如果应用涉及敏感数据,建议缩短时长。
超过 10K MAU 后费用会快速攀升。免费套餐限额为每月 10,000 名活跃用户。Pro 套餐起价 $25/月,超出部分按 MAU 计费。对于增长迅猛的 B2C 产品,账单会随之快速增长。请根据预计规模提前测算成本;Clerk 定价 ↗

官方参考资料

下一步