Skip to main content
clerk

解决 Clerk 与 Next.js 项目中的 CORS 问题

如果你正在使用 Next.js 构建 Web 应用,并使用 Clerk 进行身份验证,在从应用外部发起 API 请求时,可能会遇到 CORS(跨源资源共享)问题。当浏览器阻止向不同源发起的请求时,就会出现这种情况。

下面记录在 Clerk 与 Next.js 项目中处理 CORS 问题的步骤。

第一步:为 API 端点添加 CORS 响应头

export async function GET(request: Request) {
  return new Response("Hello, Next.js!", {
    status: 200,
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
      "Access-Control-Allow-Headers": "Content-Type, Authorization"
    }
  });
}

第二步:更新中间件

在中间件中,首先检查请求是否为 OPTIONS 请求。这是浏览器发送的预检请求,用来判断是否允许跨源访问。如果是 OPTIONS 请求,就直接返回包含跨域响应头的响应;否则,调用 Clerk 的 authMiddleware 函数。

import { authMiddleware } from "@clerk/nextjs";
import { NextFetchEvent, NextRequest } from "next/server";

export function middleware(request: NextRequest, event: NextFetchEvent) {
  if (request.method === "OPTIONS") {
    const origin = request.headers.get("origin");
    return new Response(null, {
      status: 200,
      headers: {
        "Access-Control-Allow-Origin": origin || "*",
        "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
        "Access-Control-Allow-Headers":
          "Content-Type, Authorization,  Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version",
        "Access-Control-Max-Age": "86400"
      }
    });
  }
  const auth = authMiddleware({});
  return auth(request, event);
}

总结

这篇教程介绍了如何在 Clerk 与 Next.js 项目中处理 CORS 问题:修改 API 端点以允许跨域请求,并在中间件的响应中添加浏览器访问资源所需的响应头。

完成这些修改后,就可以从不同的源向 Clerk 与 Next.js 项目发起 API 请求。