コンテンツにスキップ
Zenn Dev Ryo Kawamata Articles 2cc787af09ebce

Astro + Vercel Serverless FunctionsでのreCAPTCHA v3の導入例

  • URL: https://zenn.dev/ryo_kawamata/articles/2cc787af09ebce
  • 日付: 2026-06-26
  • Tier: Tier 3
  • 要旨: AstroとVercel Serverless Functionsを使ったWebサイトにreCAPTCHA v3を導入する実装例。reCAPTCHA v3はバックグラウンドでユーザーの動きを検証してスコアを返す方式のため、「私はロボットではありません」チェックは不要。Server側はAstroのServer Endpointsとして実装し、シークレットキーとフロントエンドから受け取ったトークンでスコアを取得する。Vercelへのデプロイ時はhybrid出力モードと@astrojs/vercelアダプターを使い、reCAPTCHA APIエンドポイントのみサーバーサイドレンダリングとする設定が必要。

詳細

reCAPTCHA v3の概要

  • バックグラウンドでユーザーの行動を解析してスコア(0.0〜1.0)を返す
  • チェックボックスや画像選択操作が不要

実装構成(Astro + Vercel Serverless Functions)

  1. reCAPTCHAコンソールでサイト登録
  • サイトキーとシークレットキーを取得
  • ドメインを登録
  1. Server側(Astro Server Endpoints)
  • src/pages/api/recaptcha.ts を作成
  • シークレットキー+フロントエンドから受け取ったトークンをGoogleのAPIに送信してスコア取得
  • ファイル先頭に export const prerender = false; を追加(hybridモードでSSRを有効化)
  1. Client側
  • サイトキーをクエリパラメーターに含めてreCAPTCHAライブラリを読み込み
  • 送信ボタン押下時に grecaptcha.readygrecaptcha.execute でトークン取得
  • トークンをAPIに送信してスコアを取得
  • AstroコンポーネントとReactコンポーネント両方の実装例を提供
  1. Vercelデプロイの設定
  • npx astro add @astrojs/vercel でアダプターを追加
  • astro.config.mjs で output: "hybrid"adapter: vercel() を設定
  • hybrid モード: デフォルトはプリレンダリング、export const prerender = false のファイルのみSSR