7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Next.jsとCloudFunctionsでGoogleReCAPTCHAを設置する方法

Last updated at Posted at 2021-08-28

皆さんセキュリティ対策ってどのようにされていますか?

私はセキュリティについてそこまで詳しくないので、個人で開発する際にはGoogleReCAPTCHAを多用しております。

とても便利ですし、なんと言っても簡単!

そんなGoogleReCAPTCHAをNext.jsで使用する方法をお教えします。

素のReactでも同じように出来ますので、ぜひ活用ください。

それでは説明していきます!

ReCAPTCHAの設定

こちらの「V3 Admin Console」から、新しいサイトを登録してください。

・ラベルは何でもよいです
・タイプはV3を選んでください
・ドメインは使用するドメインをご入力ください。
例: localhost, example.vercel.app

登録するとサイトキーとシークレットキーが表示され、後で使うのでどこかにメモしておいてください。

パッケージのインストール

Next.jsのプロジェクトでreact-google-recaptcha-v3をインストールして下さい。

npm i react-google-recaptcha-v3

_app.tsxにて、GoogleReCaptchaProviderでラッピング

_app.tsx
import { GoogleReCaptchaProvider } from "react-google-recaptcha-v3";

// 省略

return (
    <GoogleReCaptchaProvider
       reCaptchaKey= "サイトキーをここに入れる"
       language="ja"
    >
        <Component {...pageProps} />
    </GoogleReCaptchaProvider>
)

そしたらトークンを発行してみましょう!

recaptcha.tsx
import { useGoogleReCaptcha } from "react-google-recaptcha-v3";

const { executeRecaptcha } = useGoogleReCaptcha();

const handleReCaptchaVerify = async () => {
        if (executeRecaptcha) {
            const token = await executeRecaptcha("example");
            console.log(token)
        } else {
            alert("エラーが発生しました")
        }
    };

ボタンのクリックイベントとかでhandleReCaptchaVerify を実行してみましょう。

コンソール画面で長い文字列が出力されればOK!

次は、ここで発行したキーをもとにReCAPTCHAの検証を行ってみましょう。

CloudFunctionsの設定

https通信を行うので、ご自身の好きなパッケージを使ってください。

この記事ではaxiosを使います。

index.ts
exports.VerifyRecaptcha = functions.region("asia-northeast-1").https.onRequest(async (req, res) => {
    // フロントで発行したトークンを受け取る
    const token = req.query.token;

    // 
    await axios
        .post(
            `https://www.google.com/recaptcha/api/siteverify?secret="シークレットキーを入れる"&response=${token}`,
        )
        .then((result) => {
            console.log(result.data)
        })
        .catch(() => {
            throw new functions.https.HttpsError("internal", "Internal Server Error");
        }))
{
    success: true,
    challenge_ts: '2021-08-28T07:22:42Z',
    hostname: 'localhost',
    score: 0.9,
    action: 'example'
}

このようなデータが出力されればOK!

successfalseなら認証失敗となり、scoreが大体0.5以下であればスパムの可能性が高いです。

なので、セキュリティをどれだけ強くするかによってそこは変えてみてください。

ちなみにCloudFunctionsでなくても、AWSのLamdaでも実装出来ます。(検証はしていない)

いかがだったでしょうか?

セキュリティ対策を全て自分で行うとなるとかなり面倒ですよね。

なので、GoogleReCAPTCHAが気になる方はぜひ使ってみてください!

以上、「Next.jsとCloudFunctionsでGoogleReCAPTCHAを設置する方法」でした!

Thank you for reading

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?