IBM Security Verify API で CSVを使用したユーザー削除を行う

# はじめに
[2023年9月の新機能](https://www.ibm.com/docs/ja/security-verify?topic=overview-whats-new)で、IBM Security Verify APIを利用して、CSVを読み込みユーザー削除する機能がされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/3e260427-27bf-da1f-5f96-3f5b3b813ba4.png)


APIのリファレンスは、[Delete users for the specified tenant from a (CSV) file.](https://docs.verify.ibm.com/verify/reference/deleteusers)を参照ください。


**注意）今回はEUのトライアルテナントで試しました。~~2023/9/29時点で、日本のテナントには新機能がリリースされていないようで、404エラーが返ってきています。~~**

# 1.事前準備について
APIクライアントの準備や、アクセストークンの発行は、「IBM Security Verify API で ユーザーのアカウントを無効化する」と同じです。以下をご参照ください。
https://qiita.com/fitz/items/7874a95245eea3ecef13

# 2.CSVの準備

CSVの1行目は列ヘッダーで、「id」を固定で設定します。
2行目から削除するユーザーのユーザーID（ユーザー登録時にランダムに採番される値）を指定します。
登録したい属性値にあわせて1行目を変更します。
なお、CSVファイルのサイズは、最大10MB （10485760 bytes）になります。

```deleteuser.csv
id
60P7273T7P
60A7471A9Q
```

# 3.CSVによるユーザー削除

アクセストークンを取得します。
```
curl -X POST "https://<テナント名＞.verify.ibm.com/oidc/endpoint/default/token" --header "Content-Type: application/x-www-form-urlencoded" --data-urlencode "grant_type=client_credentials" --data-urlencode "client_id=<クライアントID>" --data-urlencode "client_secret=＜クライアント秘密鍵＞"
```
CSVによるユーザー削除リクエストは以下のような形になります。

ユーザーにメール通知する場合
```
curl -i -X POST https://<テナント名＞.verify.ibm.com/v2.0/CSV/deleteUsers  -H "Content-Type: multipart/form-data;charset=UTF-8" -H "Authorization: Bearer <アクセストークン>" -F file=@<CSVのファイルパス＞
```

メール通知をしない場合は、リクエストに「?notifyType=NONE」を追加します。
```
curl -i -X POST https://<テナント名＞.verify.ibm.com/v2.0/CSV/deleteUsers?notifyType=NONE   -H "Content-Type: multipart/form-data;charset=UTF-8" -H "Authorization: Bearer <アクセストークン>" -F file=@<CSVのファイルパス＞
```
成功すると、レスポンスはHTTP/1.1 202 Acceptedがかえり、戻り値としてrequest IDが返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/e33521b7-82fe-6c21-a00e-2e4eb1079999.png)


メール通知した場合は、ユーザーには以下のようなメールが送付されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/61cf4612-ecee-5318-514d-1242084a4756.png)

# 4.処理結果の確認
CSVの処理結果は、/v2.0/CSV/jobs で確認できます。
```
curl -X GET https://<テナント名＞.verify.ibm.com/v2.0/CSV/jobs/<request ID> -H "Authorization: Bearer <アクセストークン>"
```
処理が無事に完了すると、"state":"COMPLETED"となっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/065ce3d0-5138-d9b7-173f-74be7e0e63ec.png)

# 5.エラー系
## 5.1 CSVにidヘッダーがない場合
1行目がidでないため、400 Bad Requestが返る。
```
HTTP/1.1 400 Bad Request
~省略~
{"schemas":["urn:ietf:params:scim:api:messages:2.0:Error"],"status":"400","detail":"CSIAI0221E The CSV header \"60P7273T7P\" is not a valid SCIM name. The valid header names are: \"id\" "}
```

## 5.2 CSVに重複する値が含まれる場合
以下のようなCSVで同じユーザーIDを2回記載しました。
```
id
642000S6P4
642000S6P4
```
アップロード時は重複チェックは行われず、正常時と同様にアップロードが成功しました。
```
HTTP/1.1 202 Accepted
~省略~
{"_id":"c982650b-19fd-4da5-9715-70c56cfe9e4b_aad6477e-aa97-4938-9d51-dc5e1a829e2b"}
```

ジョブの結果を確認すると、2回目のユーザー削除がエラーになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/d6076309-281a-f02d-f103-bc673cecd71f.png)

## 5.3 CSVが10MBを超える場合
EXCELのオートフィル機能で100万件のダミーデータ（ABC0000001～ABC1000000）を生成したところ、11.4 MB (12,000,004 バイト)になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/b7069b15-4bea-0e57-a88c-6ad9b026ab19.png)

10MBを超えるファイルをアップロートしたところ、413 Request Entity Too Large が返ってきました。10485760バイト（=10MB)が上限と表記されていました。
```
HTTP/1.1 100 Continue
X-Note: Gateway Ack
Strict-Transport-Security: max-age=31536000 ; includeSubDomains

HTTP/1.1 413 Request Entity Too Large
~省略~
{"schemas":["urn:ietf:params:scim:api:messages:2.0:Error"],"status":"413","detail":"CSIAI0223E The CSV file size [12000004 bytes] exceeds the maximum file size of [10485760 bytes]."}
```




# 最後に
IBM Security VerifyのAPIを利用してCSVからユーザーを一括削除する方法についてについてご紹介しました。