メインコンテンツまでスキップ

reCAPTCHAを利用したパスワードリマインダーを作成する

概要

reCAPTCHAとは、Googleが無償で提供している機能です。
Webサイトのお問い合わせフォーム等で情報を登録する際、悪質なスパム投稿からWebサイトを守ることができます。

Image from Gyazo

今回は、パスワードリマインダーにreCAPTCHA v2を導入する手順を説明します。

前提条件

APIキーを取得する

KurocoでreCAPTCHAを利用する場合は、先にGoogle reCAPTCHAにてAPIキーの取得が必要になります。

備考

※ 前提として、reCAPTCHAを利用するにはGoogleアカウントが必要になります。アカウントをお持ちでない場合は、Googleのアカウント作成ページよりアカウント作成をお願いします。

まずは、Google reCAPTCHAへアクセスし、画面右上の[Admin Console]をクリックします。

Image (fetched from Gyazo)

サイト登録画面が表示されるので、必要事項を記入します。 Image (fetched from Gyazo)

項目説明
ラベルサイト名等、わかりやすい名前を入力します。
reCAPTCHA タイプreCAPTCHA v2を選択します。
また、「私はロボットではありません」チェックボックスを選択します。
ドメインhttps://」を省略したフロントエンドドメインを入力します。
例:sitekey.g.kuroco-front.app
ヒント

ローカル環境でテストをする場合はドメインにlocalhostを追加します。

利用規約を読み、問題なければ「reCAPTCHA 利用条件に同意する」にチェックを入れ[送信]をクリックしてください。

送信されると、「サイトキー」と「シークレットキー」が表示されます。

Image (fetched from Gyazo) こちらのキーはKurocoの設定で利用しますので、コピーをしておいてください。

以上でGoogle reCAPTCHA画面での設定が完了です。

Kurocoの設定

次に、Kuroco管理画面での設定となります。ご自身のKuroco管理画面へログインしてください。

reCAPTCHAと連携する

[外部システム連携] -> [reCAPTCHA]をクリックします。

fetched from Gyazo

サイト管理画面内にサイトキーとシークレットキーを入力する箇所がありますので、それぞれ入力します。

fetched from Gyazo

項目説明
reCaptcha Site Key取得したサイトキーの値を入力します。
reCaptcha Secret Key取得したシークレットキーの値を入力します。

設定完了したら、画面下部の[更新する]をクリックします。

Image (fetched from Gyazo)

エンドポイントを追加する

次にエンドポイントを作成します。 エンドポイント一覧画面へ移動し、reCAPTCHAを利用するパスワードリマインダーのエンドポイントを作成します。

[新しいエンドポイントの追加]をクリックします。

Image from Gyazo

以下のように設定します。

項目
パスreminder_with_recaptcha
カテゴリー認証
モデルLogin
オペレーションreminder
use_recaptchaチェックを入れる

Image from Gyazo

設定ができたら[追加する]をクリックしてエンドポイントを追加します。

Swaggerにて確認する

次に、問題なくエンドポイントが設定できているか、Swagger UIを利用して確認します。

エンドポイント一覧画面より、「Swaggr UI」をクリックします。

Image from Gyazo

先ほど設定したエンドポイントをクリックします。

Image from Gyazo

Request bodyのExample Valueに「recaptcha_response」のフィールドが記載されていることを確認します。

Image from Gyazo

以上でKuroco管理画面での設定は完了です。

フロントエンドの実装

reCAPTCHA認証処理の実装方法例を記載します。

reCAPTCHAモジュールのインストール

まずはNuxtのreCAPTCHAモジュールをインストールします。

ターミナルで下記実行します。

npm i @nuxtjs/recaptcha

nuxt.config.jsの修正

次に、nuxt.config.jsにreCAPTCHAを追加します。 nuxt.config.jsのmodules: に下記追記します。

  modules: [
'@nuxtjs/recaptcha',
],

また、モジュールに下記を追記します。

 recaptcha: {
hideBadge: true,
language: 'ja',
siteKey: 'reCAPTCHA_SITE_KEY',
version: 2,
size: 'normal'
},

Image from Gyazo

注意

reCAPTCHA_SITE_KEYには、先程取得したreCAPTCHAのサイトキーを記入してください。

認証コンポーネントを実装する

認証コンポーネントを作成します。 今回は、/components/inquiry配下にinquiry-recaptcha.vueというファイルを作成します。

/components/inquiry/inquiry-recaptcha.vue
<template>
<recaptcha @error="onError" @success="onSuccess" @expired="isExpired" />
</template>
<script>
export default {
methods: {
onError() {
this.$emit('update:is-succeeded', false);
},
onSuccess() {
this.$emit('update:is-succeeded', true);
},
isExpired() {
this.$emit('update:is-succeeded', false);
},
async fetchResponse() {
let response;
try {
response = await this.$recaptcha.getResponse();
} catch (error) {
response = '';
}
this.$emit('update:is-succeeded', !!response);
return response;
}
}
}
</script>

パスワードリマインダー画面を作成する

次に、reCAPTCHAを導入したいパスワードリマインダー画面で、上記認証コンポーネントを使用します。 今回は /pages/form/index.vue を下記のように作りました。

await this.$refs.recaptcha.fetchResponse()recaptcha_responseを取得し、入力されたメールアドレスと合わせてKurocoにPOSTしています。
送信後は await this.$recaptcha.reset() を呼び出す必要があります。

/pages/recaptha_for_password_reminders/index.vue
loading...
注意

上記のコードは最低限の簡易的なものになっています。

パスワードリマインダー画面を確認すると、下記のようにreCAPTCHAが表示されます。

Image from Gyazo

動作の確認

「私はロボットではありません」にチェックを入れると、Submitボタンがクリックできるようになります。
Submitボタンをクリックすると、フォームの内容に加えて、recaptcha_responseをKurocoにPostし、渡されたトークンが自動的に検証されます。
正当な値が渡された場合、フォーム送信が完了し、入力したメールアドレス宛にパスワードリセットのための仮パスワードが届きます。

Image from Gyazo

Image from Gyazo

ヒント

パスワードリマインダーのメールはメッセージひな形の識別子login/reset_passwordのテンプレートで編集可能です。

不正な値が渡された場合は、下記のようなエラーが返ります。

Image from Gyazo

以上でreCAPTHAの設定が完了です。

今回は基本的な説明のため、簡単な設定方法を例に説明しました。 reCAPTCHAの詳しい設定方法は下記Googleのドキュメントをご参照ください。
Google Developers reCAPTCHA v2


サポート

お探しのページは見つかりましたか?解決しない場合は、問い合わせフォームからお問い合わせいただくか、Slackコミュニティにご参加ください。