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

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

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

- [APIを作成する](#apiを作成する)
- [カスタム処理を作成する](#カスタム処理を作成する)
- [動作確認をする](#動作確認をする)

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

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/22c37e75a8244f384deb5b706d4979da.png)

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/44c341acced8d685e67ec1da1e85abac.png)

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

APIが作成されました。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/3c04c600fc74102913e9e668ae5cca0e.png)

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/6bc5cb1beb28c74ede6aeca89715a647.png)

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/62aaa225db5d12ee84ccc6d5a52411fe.png)

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/0bb1efe099bdae8f1c0481037416a5d9.png)

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/74cd7a36fd926dbc20b04812553072c7.png)

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

- 管理画面URL

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

- GET  
- POST
- OPTIONS

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/f2bc3744fe6a2ab042456fa8c635195c.png)

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

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

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/6bfc5c05d2cc1c6daf4740f6787a467f.png)

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

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/3048b81cc6e9725bca0548e272f948d5.png)

![Image from Gyazo](https://t.gyazo.com/teams/diverta/30d7de262e6211027cb20345c44de02a.png)

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

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/45a3b82e8fec3d1ad46a72c0bf8d394b.png)

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/471bc146570ff60efb362ece59b7fbe1.png)
  

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

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

|項目|値|
|:--|:--|
|タイトル|ip_address_login_alert|
|識別子|ip_address_login_alert|
|トリガ|ログイン後処理|
|処理|以下の内容|

```smarty
{* 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](https://t.gyazo.com/teams/diverta/2e457ed5aed09a28c9111d0e4ca902e3.png)

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

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

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

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

![Image from Gyazo](https://t.gyazo.com/teams/diverta/7da1dd2f6b9cf3fc6e0bc12683c6c9c4.png)

## 関連ドキュメント
- [Smartyプラグイン](/ja/docs/reference/smarty-plugin/)
- [カスタム処理に利用できるトリガと変数の一覧](/ja/docs/reference/trigger-variables/)
