APIルート (/api/contact/route.ts) で、メールを送信する前にトークンを確認します。クライアント側のトークンは偽装可能なため、必ずサーバーサイドで検証してください。
export async function POST(request: Request) {
const formData = await request.formData();
const turnstileToken = formData.get("cf-turnstile-response");
if (!turnstileToken) {
return NextResponse.json(
{ ok: false, message: "スパム検証に失敗しました。" },
{ status: 400 },
);
}
const verifyResponse = await fetch(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
secret: process.env.TURNSTILE_SECRET_KEY,
response: turnstileToken,
}),
},
);
const verifyData = await verifyResponse.json();
if (!verifyData.) {
.(
{ : , : },
{ : },
);
}
}