You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clerk Webhook事件触发失败,Vercel返回401认证错误求助

问题解决方案

核心问题定位

  1. publicRoutes路径配置错误:你写的/app/api/webhooks/clerk/route.ts是本地项目的文件路径,而非实际请求的URL路径,Clerk发送Webhook的目标URL是/api/webhooks/clerk,这导致middleware拦截了Webhook请求并返回401。
  2. 根路径/返回401也和路径配置的准确性相关,需同步修正。

具体修复步骤

1. 修正middleware.ts的publicRoutes配置

将Webhook路径改为实际请求的URL路径,修改后的代码:

import { authMiddleware } from "@clerk/nextjs";

export default authMiddleware({   
  publicRoutes: ['/', '/api/webhooks/clerk'] 
});  

export const config = {   
  matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], 
};

2. 确保Webhook端点正确处理请求

在/app/api/webhooks/clerk/route.ts中,必须使用POST方法并验证Clerk签名,示例代码:

import { verifyWebhookSignature } from "@clerk/nextjs/server";
import { NextResponse } from "next/server";

export async function POST(req: Request) {
  const payload = await req.text();
  const signature = req.headers.get("clerk-signature") as string;

  try {
    verifyWebhookSignature({
      secret: process.env.CLERK_WEBHOOK_SECRET!,
      signature,
      payload,
    });

    // 解析事件并写入MongoDB
    const event = JSON.parse(payload);
    // 根据event.type处理用户创建/更新/删除逻辑
    console.log("处理Webhook事件:", event);

    return NextResponse.json({ success: true });
  } catch (err) {
    console.error("签名验证失败:", err);
    return NextResponse.json({ error: "无效签名" }, { status: 400 });
  }
}

3. 额外检查项

  • 确认Clerk后台配置的Webhook目标URL为https://你的Vercel域名/api/webhooks/clerk,路径需完全匹配。
  • 重新部署Vercel项目,确保环境变量(CLERK_WEBHOOK_SECRET、MONGODB_URL)已正确同步。
  • 使用Clerk后台的Webhook测试工具发送测试事件,检查Vercel日志是否返回200状态码。

内容的提问来源于stack exchange,提问作者342k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:22:36