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

KurocoとNuxt.jsで、会員登録画面に2段階認証を実装する

概要

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

ヒント

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

学べること

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

前提条件

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

ヒント

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

事前準備

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/のディレクトリにindex.vue のファイルを作成します。

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

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

本登録用のページ作成

/login/2step_regist/ のディレクトリにindex.vue のファイルを作成します。

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

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

動作確認

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

仮登録

Image from Gyazo

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

Image from Gyazo

関連ドキュメント


サポート

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