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

新しいIPアドレスからログインがあった場合に通知を送る

概要

Kurocoは管理画面へのログイン履歴を取得するAPIを持っています。 こちらのAPIを利用して新しいIPアドレスからログインがあった場合に通知を送る機能の実装方法を紹介します。

学べること

以下の手順で新しいIPアドレスからのログインを検出し、通知を送ります。

APIを作成する

内部処理用の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_CREDENTIALSの[Allow Credentials]にチェックが入っていることを確認します。

Image from Gyazo

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

エンドポイントの作成

ログイン履歴を取得するエンドポイントはLoginHistory::listになります。

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

Image from Gyazo

ログイン履歴を取得するエンドポイント

項目設定内容
パスlogin_history
カテゴリー認証
モデルLoginHistory
オペレーションlist
self_onlyチェックを入れる
login_type0

Image from Gyazo

Image from Gyazo

カスタム処理を作成する

エンドポイントの準備ができたら、カスタム処理を書いていきます。

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

Image from Gyazo

[追加]をクリックして、新しいIPアドレスからログインがあった場合に通知を送るカスタム処理を作成します。

Image from Gyazo

新しいIPアドレスからログインがあった場合に通知を送るカスタム処理

動作としてはまず、ログイン後処理のトリガを利用して、ログインがあった場合にそのIPアドレスを取得します。 次に、IPアドレスでフィルタをして過去のログイン履歴を取得し、結果が1件のみの場合は、新しいIPアドレスからのログインを検出したとして通知を送ります。

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

項目
タイトルip_address_login_alert
識別子ip_address_login_alert
トリガログイン後処理
処理以下の内容
{* Retrieve information when logged in *}
{api_internal
var='current_log'
status_var='status'
endpoint='/rcms-api/3/login_history'
method='GET'
member_id=$smarty.session.member_id}

{* Retrieve other login histories with the same IP address *}
{* Refer to the second log (login_history_list[1]) because the api_internal retains the log. *}
{assign_array var='queries' values=''}
{assign var='queries.ip_address' value=$current_log.login_history_list[1].ip_address }

{api_internal
var='log_history'
status_var='status'
endpoint='/rcms-api/3/login_history'
method='GET'
queries=$queries
member_id=$smarty.session.member_id}

{if $log_history.pageInfo.totalCnt == 1}
{capture name=mail_body}
A login from a new IP address has been detected.
Please verify if it was you.

IP Address: {$current_log.login_history_list[1].ip_address}
Date and Time: {$current_log.login_history_list[1].login_ymdhi}
Admin Panel URL: {$smarty.const.ROOT_MNG_URL}/management/
{/capture}

{sendmail
var='result'
to=$smarty.session.email
subject="Login detected from a new IP address."
contents=$smarty.capture.mail_body}

{logger msg1="Login detected from a new IP address." msg2=$current_log.login_history_list[1]}
{/if}

Image from Gyazo

備考

Smartyなどで内部的にログインをすると、127.0.0.1やKurocoのリクエスト元IPアドレスがログに残ります。
上記のコードでも、認証ありのapi_internalで内部ログインのログが残るため考慮して利用するデータを選択しています。
Kurocoのリクエスト元IPアドレスを確認したい場合はサポートまでご連絡ください。

ヒント

{logout}のSmartyプラグインを設定すると強制的にログアウトさせることができます。
ログイン許可IPをメンバー情報に持たせる等の対応と合わせて、新しいIPアドレスの認証機能を実装可能です。

動作確認をする

以上で新しいIPアドレスからのログインを検出する設定は完了です。
普段と違う環境からログインをして、通知が届くことを確認します。

想定通りに設定できていれば以下のように通知が届きます。

Image from Gyazo

関連ドキュメント


サポート

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