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

会員登録画面に2段階認証を実装する

概要

新規会員登録時に、ランダム6桁のワンタイムパスワード(OTP)を発行して認証させる2段階認証を実装します。

ヒント

本チュートリアルではメールを使用した2段階認証を紹介しますが、twillioと連携することでSMSによる2要素認証も同様の手順で実装できます。

学べること

新規会員登録時の2段階認証は、それぞれの以下の手順で実装します。

前提条件

このページは、KurocoとNuxt.jsでのプロジェクトが構築済みであることを前提としています。
まだ構築していない場合は、下記のチュートリアルを参照してください。

ヒント

SMSによる2要素認証を実装する場合は以下のチュートリアルも実施が必要です。

備考

本チュートリアルでは以下のバージョンでコードを書いています。
Nuxt2: v2.15.8
Nuxt3: v3.8.0

事前準備

APIの作成

DefaultのAPIと、内部処理用のInternalのAPIを利用します。
Image from Gyazo

内部処理用のAPI作成

Kuroco内部でのみ利用するエンドポイントはAPIを分けておくことをお勧めします。
そこで、まずは内部利用のためのAPIを新規で作成します。
既に追加済みの場合は次のステップに進んで構いません。

APIの作成

Kuroco管理画面のAPIより「追加」をクリックします。

Image from Gyazo

API作成画面が表示されるので、下記入力し「追加する」をクリックします。

Image from Gyazo

項目設定内容
タイトルInternal
1.0
ディスクリプション内部処理用のAPI

APIが作成されました。

Image from Gyazo

セキュリティの設定

次にセキュリティの設定をします。[セキュリティ] をクリックします。

Image from Gyazo

セキュリティを[動的アクセストークン]に設定して、[保存する]をクリックします。

Image from Gyazo

セキュリティを[動的アクセストークン]に設定後、Login::tokenのエンドポイントが無い場合、利用をお勧めされますが、内部利用のみの場合は無視して構いません。

Image from Gyazo

CORSの設定

次にCORSの設定をします。[CORSを設定する] をクリックします。

Image from Gyazo

CORS_ALLOW_ORIGINSの [Add Origin] をクリックし、下記を追加します。

  • 管理画面URL

CORS_ALLOW_METHODSの [Add Method] をクリックし、下記を追加します。

  • GET
  • POST
  • OPTIONS

CORS_ALLOW_REDENTIALSの[Allow Credentials]にチェックが入っていることを確認します。

Image from Gyazo

問題なければ [保存する] をクリックします。

会員登録時の2段階認証

それでは、会員登録時の2段階認証を実装してみます。
フロントエンドからの操作は以下の3ステップを想定します。

ステップフロント(ユーザー)の操作Kurocoの処理利用するAPI
1メンバー登録のための基本情報を送付する仮メンバーを作成するMember::invite
2招待メールのURLにアクセスし、ワンタイムパスワード送付のボタンをクリックするemai_hashを利用して、仮メンバー情報にアクセス、ワンタイムパスワードを追加し、メールを送信するApi::request_api
Member::invite
MemberProvisional::update
3ワンタイムパスワードを入力して送付emai_hashを利用して、仮メンバー情報にアクセス、ワンタイムパスワードが一致した場合に会員登録をするApi::request_api
Member::invite
Member::insert

エンドポイントの作成

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

Image from Gyazo

今回は下記エンドポイントを作成します。

  • 仮メンバー登録のエンドポイント
  • ワンタイムパスワードを作成・送付するカスタム処理を呼ぶエンドポイント
  • ワンタイムパスワードの確認と本登録をするエンドポイント

仮メンバー登録のエンドポイント

項目設定内容
パス2step_member_invite
カテゴリーメンバー
モデルMember
オペレーションinvite

ワンタイムパスワードを作成・送付するカスタム処理を呼ぶエンドポイント

項目設定内容
パスset_and_send_otp
カテゴリーAPI
モデルApi
オペレーションrequest_api_post
nameset_and_send_otp

ワンタイムパスワードの確認と本登録をするエンドポイント

項目設定内容
パスcheck_otp_and_regist
カテゴリーAPI
モデルApi
オペレーションrequest_api_post
namecheck_otp_and_regist

内部利用のエンドポイントの作成

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

Image from Gyazo

今回は下記エンドポイントを作成します。

  • 仮メンバー更新のエンドポイント
  • メンバー登録のエンドポイント

メンバー登録のエンドポイント

メンバー登録のエンドポイントを下記設定にて作成します。

項目設定内容
パスpre_member_update
カテゴリーメンバー
モデルMemberProvisional
オペレーションupdate

メンバー登録のエンドポイント

メンバー登録のエンドポイントを下記設定にて作成します。

項目設定内容
パス2step_member_regist
カテゴリーメンバー
モデルMember
オペレーションinsert
default_group_id適用するメンバーグループのIDを入力してください。
グループIDはグループより確認できます。
login_ok_flgチェックを入れる

カスタム処理の作成

ワンタイムパスワードを発行・送信するカスタム処理

ワンタイムパスワードとその有効期限を作成し、仮メンバー情報を更新、ワンタイムパスワードをユーザー宛に送付するカスタム処理を作成します。

[オペレーション] -> [カスタム処理]をクリックします。

Image from Gyazo

[追加]をクリックします。

Image from Gyazo

以下のように入力します。

項目設定
タイトルset_and_send_otp
識別子set_and_send_otp
処理以下のコード
set_and_send_otp
loading...
ヒント

ワンタイムパスワードをSMSで送付する場合はsendmailto=$pre_member_info.data.emailの部分を

to="`$pre_member_info.data.ext_info.tel`@twilio.r-cms.jp"のように変更します。

ワンタイムパスワードの一致判定をするカスタム処理

ワンタイムパスワードが一致した場合にMember::insertで会員登録をするカスタム処理を作成します。

[オペレーション] -> [カスタム処理]をクリックします。

Image from Gyazo

[追加]をクリックします。

Image from Gyazo

以下のように入力します。

項目設定
タイトルcheck_otp_and_regist
識別子check_otp_and_regist
処理以下のコード
check_otp_and_regist
loading...

SwaggerUIで動作を確認する

KurocoのAPIとカスタム処理の準備ができたらSwaggerUIを利用して動作の確認をします。

会員登録のリクエストを送る

Default エンドポイントのSwaggurUIから/rcms-api/1/2step_member_invite をクリックします。

Image from Gyazo

[try it out]をクリックします。
Image from Gyazo

Request bodyに以下を入力して[Execute]をクリックします。

{
"email": "example@dexample.com",
"ext_info": {
"name": "MyName",
"login_pwd": "********",
"tel": "00011112222"
}
}

Image from Gyazo

200のレスポンスを確認します。

Image from Gyazo

招待メールが届くのでkeyの部分をコピーします。

Image from Gyazo

ヒント

招待メールの内容はメッセージひな形member/pre_regist_thanksのテンプレートで編集が可能です。 リンク部分を{$smarty.const.ROOT_URL}/login/2step_regist?key={$preregist_key}のように修正して、 メールから直接遷移できるように調整してください。

ワンタイムパスワードの送付リクエストを送る

/rcms-api/1/set_and_send_otp をクリックします。

Image from Gyazo

[try it out]をクリックします。

Image from Gyazo

Request bodyに以下を入力して[Execute]をクリックします。

{
"email_hash": "KEY"
}

Image from Gyazo

注意

"KEY"の部分は先ほどコピーした招待メールのkeyにしてください。

200のレスポンスを確認します。

Image from Gyazo

ワンタイムパスワードがメールで届くので確認します。

Image from Gyazo

ワンタイムパスワードを送る

/rcms-api/1/check_otp_and_regist をクリックします。

Image from Gyazo

[try it out]をクリックします。

Image from Gyazo

Request bodyに以下を入力して[Execute]をクリックします。

{
"email_hash": "KEY",
"otp":"OTP"
}
注意

"OTP""KEY"の部分は先ほどコピーした招待メールのkeyにしてください。

Image from Gyazo

200のレスポンスを確認します。

Image from Gyazo

メンバー情報一覧に遷移すると、ユーザー登録されていることが確認できます。

Image from Gyazo

以上でKuroco側の設定は完了です。
SwaggerUIで確認した動作をフロントエンドで実装ください。

フロントエンドの実装をする

仮登録用のページ作成

/login/2step_pre_regist/のディレクトリで表示できるよう以下のファイルを作成します。

/pages/login/2step_pre_regist/index.vue
loading...
注意

上記サンプルのサンプルは参考のため最低限のコードになっています。
実際に利用する際には、フォームのバリデーション処理も追加ください。

本登録用のページ作成

/login/2step_regist/ のディレクトリで表示できるよう以下のファイルを作成します。

/pages/login/2step_regist/index.vue
loading...
備考

email_hashはクエリで受け取るようにしました。

動作確認

自身の環境に合わせて調整し、動作確認ができたら、新規会員登録時の2段階認証の実装は完了です。

仮登録

Image from Gyazo

追加のワンタイムパスワード登録

Image from Gyazo

関連ドキュメント


サポート

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