【Astro】Contact FormにValidationとreCAPTCHA v3を追加する
初稿:
- 9 min read -
記事概要
- 先日のBloggerからAstroへ移行した記事の別途詳細
※参考 - Blog移行記事
10年以上の期間お世話になったGoogle Bloggerに別れを告げ、この度AstroでBlogサイトを構築し移行した。Astroは静的サイトを手軽に開発できる軽量フレームワーク。無料のテンプレートをベースにカスタマイズを行った。それなりの作業ボリュームとなったので、詳細は別記事に分け、今回は移行作業全体をまとめる。
目的
- Astroで構築したWebサイトにContact Formを設置する
- React用のパッケージ「React Hook Form」でValidationを行う
- AstroはReactのコンポーネントも使える(Astroアイランド)
- reCAPTCHA v3を導入しスパム対策を行う
- reCAPTCHAのサーバサイド検証をNewtのForm Appというサービスで行う
用語説明
Astro とは?
astroは、ブログやマーケティング、eコマースなど、コンテンツ駆動のウェブサイトを作成するためのウェブフレームワークです。astroは、新しいフロントエンドアーキテクチャを開拓し、他のフレームワークと比較してjavascriptのオーバーヘッドと複雑さを低減することで知られています。高速でseoに優れたウェブサイトが必要なら、astroが最適です。 — astro公式docs より引用をDeepLで翻訳
reCAPTCHA とは?
reCAPTCHA は、スパムや不正行為からサイトを保護する無料のサービスです。高度なリスク分析手法を使用して、人間と bot を区別します。 — reCAPTCHA | Google for Developersより引用
React Hook Form とは?
- React用のValidation機能を提供するプラグイン
パフォーマンス、柔軟性、拡張性に優れたフォームと、使いやすいバリデーション。 — React Hook Formより引用 をDeepLで翻訳
Newtとは?
- 2021年創業のスタートアップ企業
- ヘッドレスCMS、フォーム構築サービスを提供している
- 無料のEntryプランのスペックは以下のとおり
- フォーム作成数:無制限
- 月間メッセージ数:30
- 自動返信メール
- CSVダウンロード
- スパム対策
- Form App料金プラン | ヘッドレスCMS「Newt」
コンテンツ管理の新しいスタンダード | ヘッドレスCMS「Newt」
Newtは、APIベースでコンテンツ管理を行うことができるヘッドレスCMSです。最新のウェブ環境に対応したCMSでコンテンツとチームのパフォーマンスを最大化します。
作業環境
- OS - Ubuntu-22.04LTS on WSL2
- Node.js - v20.14.0
- pnpm - v9.4.0
- Astro - v4.11.3
- TailwindCSS - v3.4.4
作業手順
- reCAPTCHA v3を登録
- NewtにForm Appを追加
- react、react-hook-formをインストール
- Reactコンポーネント(Contact Form)の実装
- Contactページを作成
作業詳細
reCAPTCHA v3を登録
- reCAPTCHAのドキュメント
- Googleアカウントが必要
- 以下URLにアクセスし、登録を行う
- 入力する項目は以下のとおり
項目 | 説明 |
---|---|
ラベル | 識別しやすい名前 |
reCAPTCHA タイプ | v3 推奨 |
ドメイン | サイトのドメイン |
Google Cloud Platform | プロジェクトを指定 |
- 注意事項
- ローカルでテストする場合はドメインにlocalhost等も追加しておく
- ここでの情報はGoogle Cloud Platform(以降、GCP)のプロジェクトに保存される
- あらかじめGCPのプロジェクトを用意する、あるいはこの画面で新規作成する
- 送信ボタンをクリックし、表示されたreCAPTCHA のキーを保存しておく
- サイトキー: Astroのcomponentで使用する
- シークレットキー: NewtのForm Appで使用する
- 画面遷移してしまった場合は「歯車アイコン → reCAPTCHAのキー」で確認できる
以上でreCAPTCHAの登録作業は完了。
NewtにForm Appを追加
- Newt Form Appのドキュメント
Form App 登録
- 次のURLにアクセスし、アカウントを登録する
- 次のドキュメントの「Step 1」に従いForm Appとフォームを追加し、エンドポイントのURLを保存しておく
- サイドバーの先ほど登録したForm Appの右端「…」をクリックし、App設定を開く
- サイドバーのフォームをクリックし、スパム対策の有効にする、reCAPTCHAシークレットキーを入力
- 画面右上の「保存」をクリック
受信通知メールの設定
- 問い合わせを受信する設定を行う
- 同じ画面の「メール設定」を開き以下を設定する
- 受信通知メールを有効にする: をオンにする
- 通知を受け取るメールアドレス: 受信したいメールアドレスを入力
- 件名: メールの件名
- 本文: 下記コードブロックを参照
- {submission.xxxxxx} でフォームから送信された値を使用できる
- 画面右上の「保存」をクリックする
以上でNewtにForm Appを追加する作業は完了。
react、react-hook-formをインストール
react インストール
- 以下コマンドでパッケージをインストールする
- 複数の関連パッケージの追加を聞かれるのでyes
- astro.config.mjsの自動変更を聞かれるのでyes
- tsconfig.jsonの自動更新を聞かれるのでyes
- 完了
react-hook-form インストール
- 以下コマンドでreact-hook-formをインストール
- 完了
Reactコンポーネント(Contact Form)の実装
- 仕様は以下のとおり
- reCAPTCHのサイトキーと、Newt Form Appのエンドポイントをpropsで受ける
- react-hook-formのValidationを埋め込んだフォームをレンダリングする
- ユーザが送信を実行すると、フォームデータとreCAPTCHAのtokenをNewt Form AppにPOSTする
- Newt側でreCAPTCHAサーバと認証処理を行う
- レスポンスがOkなら/thanks/ページ、エラーなら/error/ページへ遷移する
Contactページを作成
- siteKeyはreCAPTCHA作成後に表示されたサイトキーを使用
- formUrlはNewtのForm App作成後に表示されたエンドポイントを使用
以上で実装は完了。