SuperAPI AI 工具集

clerk-webhooks

编程与开发

查看项目

更新于 10-15 10:24

技能介绍

用途

clerk-webhooks 用于接入 Clerk 的 Webhook 能力,实时接收 Clerk 产生的事件并做数据同步。资料明确说明 Webhook 是异步的,适用于后台任务(同步、通知),不适合同步流程。

主要能力

可监听的事件类别包括:

  • User:user.created、user.updated、user.deleted
  • Organization:organization.created、organization.updated、organization.deleted
  • Organization Domain:organizationDomain.created、organizationDomain.updated、organizationDomain.deleted
  • Organization Invitation:organizationInvitation.created、organizationInvitation.accepted、organizationInvitation.revoked
  • Organization Membership:organizationMembership.created、organizationMembership.updated、organizationMembership.deleted
  • Roles:role.created、role.updated、role.deleted
  • Permissions:permission.created、permission.updated、permission.deleted
  • Session:session.created、session.updated、session.ended、session.removed、session.revoked、session.pending
  • Communication:email.created、sms.created
  • Invitations:invitation.created、invitation.accepted、invitation.revoked
  • Waitlist:waitlistEntry.created、waitlistEntry.updated

完整事件目录位于 Dashboard → Webhooks → Event Catalog。

使用方式

快速开始步骤:

  1. 在 app/api/webhooks/route.ts 创建端点
  2. 使用 @clerk/nextjs/webhooks 中的 verifyWebhook(req)
  3. Dashboard → Webhooks → Add Endpoint
  4. 设置环境变量 CLERK_WEBHOOK_SIGNING_SECRET
  5. 将路由设为公开(不被中间件保护)

关键模式:

  • 公开路由:Webhook 无签名传入,需确保 clerkMiddleware() 不保护 /api/webhooks(.*) 路径。
  • 校验 Webhook:使用正确导入与单一参数——
import { verifyWebhook } from '@clerk/nextjs/webhooks'
const evt = await verifyWebhook(req)  // Pass request directly
  • 类型安全事件:按事件类型收窄——
if (evt.type === 'user.created') {
  // TypeScript knows evt.data structure
}
  • 处理全部三类事件:不要只监听 user.created,也要处理 user.updated 和 user.deleted。
  • 异步工作入队:立即返回 200,将耗时操作入队——
await queue.enqueue('process-webhook', evt)
return new Response('Received', { status: 200 })

适用场景

需要同步的情况:

  • 需要其他用户的数据(社交功能、个人资料)
  • 存储额外的自定义字段(生日、国家、简介)
  • 构建通知或集成

不需要同步的情况:

  • 只需要当前用户数据(使用 session token)
  • 没有自定义字段(Clerk 已包含所有信息)
  • 需要立即访问(Webhook 是最终一致性)

可靠性与限制

  • 重试:Svix 会对失败的 Webhook 最多重试 3 天。返回 2xx 表示成功,4xx/5xx 触发重试。
  • 重放:失败的 Webhook 可从 Dashboard 重放。
  • 文档参考:
    • 概览:https://clerk.com/docs/guides/development/webhooks/overview
    • 同步到数据库:https://clerk.com/docs/guides/development/webhooks/syncing
    • 调试:https://clerk.com/docs/guides/development/webhooks/debugging
    • 事件目录:https://dashboard.clerk.com/~/webhooks(Event Catalog 标签页)

常见陷阱:

症状 原因 修复
校验失败 导入或用法错误 使用 @clerk/nextjs/webhooks,直接传入 req
路由未找到(404) 路径错误 使用 /api/webhooks
未授权(401) 路由被保护 将路由设为公开
数据库无数据 异步任务待处理 等待/检查日志
重复条目 只处理 user.created 同时处理 user.updated
超时 处理程序过慢 将异步工作入队

测试与部署:

  • 本地:使用 ngrok 将 localhost:3000 隧道到公网,将 ngrok URL 添加到 Dashboard 端点。
  • 生产:将 Webhook 端点 URL 更新为生产域名,将签名密钥复制到生产环境变量。

关于收费、价格与平台支持等具体信息,资料中暂未提供。