Yellowfin PHP + REST API ユーザー削除

## はじめに
これまでも、[『SSO』](https://qiita.com/ExtremeCarvFJ/items/989a3c2bfa34ccdd177f)、[『情報参照』](https://qiita.com/ExtremeCarvFJ/items/0d3d9005b03e917ad839)、[『ユーザー登録』](https://qiita.com/ExtremeCarvFJ/items/1ddf337a6b24a948dc1e)、[『グループメンバー登録』]( https://qiita.com/ExtremeCarvFJ/items/dbd0f8a0722e2bfe06d7)など、Yellowfin の管理に REST API を活用する方法を幾つか紹介してきました。今回は、ユーザー削除に REST API を活用する方法を紹介します。
社員の異動時や退職時などに、人事情報やディレクトリサービスの情報と連動し、バッチ処理などで Yellowfin からアカウントを削除し、アクセス権をはく奪する処理はセキュリティ面からも非常に重要です。アカウント削除の処理は、手動で行うのではなく、API を活用して自動化するのが望ましいですね。

## REST API 開発者用ドキュメントと動作検証
Yellowfin の REST API に関する詳細な情報は、[開発者サイト](https://developers.yellowfinbi.com/dev/api-docs/current/)に記述があります。
上記で API の仕様を確認した後、ブラウザのディベロッパーツールなどで、リクエストする情報と、レスポンスの情報が正しいか否かを確認しましょう。Chrome の場合だと、API Tester が該当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/bf2a7b07-29e5-2bd1-2b2d-8793e66ce9d8.png)


## アクセストークンの取得
Yellowfin のリソースにアクセスするために、2 種類のトークンを使用します。
1 つ目はリフレッシュトークンです。有効期限の無いトークンで、アクセストークンを取得するために必ず必要です。refresh-tokens API に対してリフレッシュトークンを POST で要求し取得します。
2 つ目はアクセストークンです。access-tokens API に対して入手済みのリフレッシュトークンを使って、POST で要求し取得します。
アクセストークンの取得に関する詳細は、[『情報参照』](https://qiita.com/ExtremeCarvFJ/items/0d3d9005b03e917ad839)記事の該当箇所をご確認ください。

## ユーザー ID の取得
先の手順で取得したトークンを用いて、ユーザー ID に関する情報を GET で取得します。以下の処理では、ユーザー ID を指定して削除処理を実行します。
ユーザー ID の取得に関しても、[『情報参照』](https://qiita.com/ExtremeCarvFJ/items/0d3d9005b03e917ad839)記事の該当箇所をご確認ください。

## ユーザーの削除
ここまでに取得したアクセストークンとユーザー ID を使って、該当ユーザーを REST API 経由で削除します。
ユーザー削除に関する API の仕様は[『Removes a user from all organizations』](https://developers.yellowfinbi.com/dev/api-docs/current/#operation/deleteUserAdmin)に説明があります。この仕様に従って、/api/admin/users/{userId} API に対して、DELETE で要求を投げます。
下記サンプルでは、変数宣言個所で useId 変数に削除対象のユーザー ID を記述し、URL の一部とします。
ヘッダーデータの一部に UNIX 時間を示す整数値と、先の手順で取得したアクセストークンを指定しています。
これら情報を伴い、cURL で DELETE 処理を実行します。

```php:ユーザー削除
//変数宣言
$userId = '13191';
$url3 = 'http://localhost:8080/api/admin/users/'.$userId;
$time2 = ceil(microtime(true)*1000);

//ユーザー削除：ヘッダーデータ作成
$header3 = array(
    'Authorization:YELLOWFIN ts='.$time2.', nonce=123, token='.$accessToken,
    'Accept:application/vnd.yellowfin.api-v2+json'
);

//ユーザー削除：YellowfinにDELETEで要求
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_URL, $url3);
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch3, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch3, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true); 
$result3 = curl_exec($ch3);
$result3_json = json_decode($result3, true);
curl_close($ch3);
```

## プログラム全容
プログラムの全容は以下の通りです。
```php:deleteUser.php
//変数の宣言
$adminId = 'admin@yellowfin.com.au';
$adminPassword = 'test';
$time = ceil(microtime(true)*1000);
$url = 'http://localhost:8080/api/refresh-tokens';
$url2 = 'http://localhost:8080/api/access-tokens';
$refreshToken = "";
$accessToken = "";

//リフレッシュトークン：HEADERデータ作成
$header = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123',
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json;charset=UTF-8'
);

//リフレッシュトークン：BODYデータ作成
$body = array(
    'userName'=>$adminId,
    'password'=>$adminPassword
);
$body_json = json_encode($body, JSON_PRETTY_PRINT);

//リフレッシュトークン：Yellowfinにトークンを要求
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
$json_result = json_decode($result);
$refreshToken = $json_result->securityToken;
curl_close($ch);

//アクセストークン：HEADERデータ作成
$header2 = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$refreshToken,
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json'
);

//アクセストークン：Yellowfinにトークンを要求
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_HTTPHEADER, $header2);
curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch2, CURLOPT_POSTFIELDS, '');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, $url2);
curl_close($ch);
$result2 = curl_exec($ch2);
$json_result2 = json_decode($result2);
$accessToken=$json_result2->securityToken;

//変数宣言
$userId = '13191';
$url3 = 'http://localhost:8080/api/admin/users/'.$userId;
$time2 = ceil(microtime(true)*1000);

//ユーザー削除：HEADERデータ作成
$header3 = array(
    'Authorization:YELLOWFIN ts='.$time2.', nonce=123, token='.$accessToken,
    'Accept:application/vnd.yellowfin.api-v2+json'
);

//ユーザー削除：YellowfinにDELETEで要求
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_URL, $url3);
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch3, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch3, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true); 
$result3 = curl_exec($ch3);
$result3_json = json_decode($result3, true);
curl_close($ch3);
```

上記プログラムを実行すると、該当ユーザーが削除されます。
```powershell:deleteUser.php
PS> php deleteUser.php
```

## 最後に
Yellowfin には、レガシー技術として、Webservice も備わっており、SOAP や XML を使って、同様の処理を実装することも可能です。しかし、今後は REST API を中心に、API 機能を拡充していく予定です。今後、処理の自動化を進めていきたい場合、REST API の活用を優先的に検討することをお勧めします。

何はともあれ、皆様、良いデータ分析を! See you then! Cheers! Santé! Skål!