Db2 Warehouse on Cloud の REST API で ユーザー作成周りを試してみる。

#ご挨拶
突然ですがQiitaを始めてみました。以前長らく担当していたDXやCMS、Collaboration Solutionから方向転換しまして現在データベース関連を勉強している毎日です。気が付いたことや検証したことを備忘録的につけていこうと思っています。

Db2 Warehouse on Cloud の REST API 周りを試す機会があり、そんな時に@steel_mikanさんが記載されている記事が大変参考になりました。本記事では、追加の情報としてユーザー周りのAPIの動作結果を記載していこうと思います。
https://qiita.com/steel_mikan/items/2d5b5044b44e2fa8947b


#0.はじめに
#####実施する上で必要となる環境情報
- Db2 Warehouse on Cloud の環境と Administratorロールを持つユーザー
- curlが実行できる環境（クライアントPC等)

#####マニュアル
https://developer.ibm.com/static/site-id/85/api/db2whc-v3/
マニュアルは見方のコツがあるので、それも記載したいと思います。

#1. Db2 Warehouse on Cloud上に新規にユーザーを作成する。

#####1-1. アクセスする上で必要となるトークンを発行する
はじめに、トークンを発行します。APIのマニュアルにコマンドのサンプルがありますので、見てみましょう。
Authenticationカテゴリの一番上に「POST」「/auth/tokens」があります。こちらをクリックし、「Try it out」をクリックします。
![cf42c94c57191f80e0a3_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/0af3294b-4aa1-7187-b0ef-2d67149309c8.png)
下の方にスクロールすると「Execute」ボタンが見えますので、これをクリックします。
![cf42c94c57191f80e0a3_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/22870e0b-92ba-f936-6d6e-cf7f25da765a.png)
するとコマンドのサンプルが出現しますので、こちらのCurl部分をコピーしてエディタなどに貼り付けておきます。
![cf42c94c57191f80e0a3_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/e0c03910-1431-7dca-2660-874a7f1cf7d2.png)

```bash:生成されたサンプルのコマンド
curl -X POST "https://developer.ibm.com/dbapi/v3/auth/tokens" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"userid\": \"string\",  \"password\": \"string\"}"

```
サンプルのcurlのコマンドを自分の環境の情報に合わせます。useridとpasswordの部分はstringと記載されているところを修正します。Administratorロールのユーザーを指定してください。

```bash:URLなどを直したサンプル
curl -X POST "https://dashdb-mpp-***.bluemix.net:8443/dbapi/v3/auth/tokens" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"userid\": \"asaito\",  \"password\": \"************\"}"

```

整形したコマンドを実行してみます。

```bash:実行結果
(base) Asuka-no-MacBook-Air:~ asaito$ curl -X POST "https://dashdb-mpp-***.bluemix.net:8443/dbapi/v3/auth/tokens" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"userid\": \"asaito\",  \"password\": \"***********\"}"
{"userid":"asaito","token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjEyMjQ5MzIsInVzZXJOYW1lIjoiYXNhaXRvIiwiY29va2llIjoiIiwiaXNzdWUiOiJodHRwczovLzEwLjEzMy4yMTguMjMyOjg4ODAvIn0.c0pbIMz7crzxK763IWQKqCV-W7K0B6nqJ0w8A1rSWdU"}
(base) Asuka-no-MacBook-Air:~ asaito$ 

```
エラーがなければ、トークンが発行されます。4つ目のダブルコーテーションのセットで囲われている長い文字列がトークンです。
以後のAPIのリクエストで必要になるので、エディタなどにコピーしておきます。


#####1-2. ユーザー作成のコマンドを確認する。
再び、APIのマニュアルを見てみましょう。下の方に「Users」カテゴリがあります。そこの「POST」「/users」がユーザー作成のAPIです。クリックしてみましょう。
![cf42c94c57191f80e0a3_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/40aeb64c-1ea4-5b9a-9887-f0a0f95b4faf.png)

「Try it out」をクリックします。
![cf42c94c57191f80e0a3_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/b24f2e6c-4c30-1ee6-b173-ab353b2870ee.png)

下の方にスクロールして、「Execute」ボタンをクリックすると、サンプルのコマンドが表示されますので、前回と同じ要領でコピーしてエディタに貼り付けます。
![cf42c94c57191f80e0a3_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/929b1270-2cd2-17c9-b9a3-b1f081a104f9.png)

```bash:生成されたサンプルのコマンド
curl -X POST "https://developer.ibm.com/dbapi/v3/users" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"id\": \"string\",  \"name\": \"string\",  \"password\": \"string\",  \"role\": \"bluuser\",  \"email\": \"string\",  \"locked\": \"yes\",  \"authentication\": {    \"method\": \"internal\",    \"policy_id\": \"string\"  },  \"metadata\": {    \"guid\": \"string\",    \"url\": \"string\",    \"created_at\": \"string\",    \"updated_at\": \"string\"  }}"

```

これを自分の環境の情報に合わせます。最低限修正するものは、

- POST先のURL
- id（のstring部分）
- name（のstring部分）
- password（のstring部分）
- roleは以下のいずれかを設定します。
    - Administratorロールの場合はbluadmin
    - Userロールの場合は、bluuser
- email（のstring部分）
です。

- lockedの指定は必須ではありません。指定しない場合はnoになります。
- authenticationの指定は必須ではありません。指定しない場合は
    - methodはinternalになります。
    - policy_idはDefaultになります。
- metadataの指定も必須ではありません。値が自動でセットされます。
指定しないオプションはコマンド文から除きます。

POST先のURL、id、name、password、role、emailを自分の環境に合わせて修正してみます。

```bash:POST先のURL、id、name、password、role、emailを直したサンプル
curl -X POST "https://dashdb-mpp-***.bluemix.net:8443/dbapi/v3/users" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"id\": \"user26\",  \"name\": \"user26\",  \"password\": \"************\",  \"role\": \"bluuser\",  \"email\": \"***@***.com\"}"

```

整形したコマンドに以下のオプションをつけて出来上がりです。APIのマニュアルの一番上にも記載がありますが、全てのリクエストはトークンの指定が必要となります。

```bash:以下をcurlコマンドの最後に追加する
-H  "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjEyMjQ5MzIsInVzZXJOYW1lIjoiYXNhaXRvIiwiY29va2llIjoiIiwiaXNzdWUiOiJodHRwczovLzEwLjEzMy4yMTguMjMyOjg4ODAvIn0.c0pbIMz7crzxK763IWQKqCV-W7K0B6nqJ0w8A1rSWdU"

```

#####1-3. ユーザー作成のコマンドを実行する。
上記2つのコマンドをつなげて実行してみます。（２つの文をつなげる際、間に半角スペースが必要となります。）

```bash:実行結果
(base) Asuka-no-MacBook-Air:~ asaito$ curl -X POST "https://dashdb-mpp-***.bluemix.net:8443/dbapi/v3/users" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"id\": \"user26\",  \"name\": \"user26\",  \"password\": \"************\",  \"role\": \"bluuser\",  \"email\": \"***@***.com\"}" -H  "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjEyMjQ5MzIsInVzZXJOYW1lIjoiYXNhaXRvIiwiY29va2llIjoiIiwiaXNzdWUiOiJodHRwczovLzEwLjEzMy4yMTguMjMyOjg4ODAvIn0.c0pbIMz7crzxK763IWQKqCV-W7K0B6nqJ0w8A1rSWdU"
{"password":"************************************************************","metadata":{"updated_at":"20190622170649Z","guid":"user26","created_at":"20190622170647Z","url":"https:\/\/dashdb-mpp-***.bluemix.net\/dbapi\/v3\/users\/user26"},"role":"bluuser","name":"user26","id":"user26","locked":"no","email":"***@***.com","authentication":{"method":"internal","policy_id":"Default"}}
(base) Asuka-no-MacBook-Air:~ asaito$ 

```
ユーザーが作成できました。
ブラウザでWebコンソールにログインして確認してみてください。

#2. 既存ユーザーを更新する。

先ほど作成したユーザーのpolicy_idを更新したいと思います。

#####2-1. policy_idを確認する。
これまでとおなじ要領で、APIのマニュアルを確認します。ポリシーの一覧の出力は Authenticationカテゴリの「GET」の「/auth_policies」です。

「Try it out」と「Execute」をクリックしてサンプルを出力します。出力されたサンプルにトークンの指定をつけて実行します。

```bash:実行結果
(base) Asuka-no-MacBook-Air:~ asaito$ curl -X GET "https://dashdb-mpp-***.bluemix.net:8443/dbapi/v3/auth_policies" -H  "accept: application/json" -H  "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjEyMjczMjksInVzZXJOYW1lIjoiYXNhaXRvIiwiY29va2llIjoiIiwiaXNzdWUiOiJodHRwczovLzEwLjEzMy4yMTguMjMyOjg4ODAvIn0.IrII9WNPNDyd9DJ0_aKrH0Zm6WesIlqdWS89tZi5I_I"
[{"lockout_duration":30,"metadata":{"updated_at":"Sat Jun 22 17:46:05 UTC 2019","guid":"Default","created_at":"Sat Jun 22 17:46:05 UTC 2019","url":"\/auth_policies\/Default"},"password_expiration":0,"name":"Default","min_password_length":12,"id":"Default","failed_login_attempts":5,"password_history":0},{"lockout_duration":0,"metadata":{"updated_at":"Thu Dec 20 10:26:22 UTC 2018","guid":"71a8fcc5-71a8-4db9-8c0f-32bf6782b827","created_at":"Thu Dec 20 10:26:22 UTC 2018","url":"\/auth_policies\/71a8fcc5-71a8-4db9-8c0f-32bf6782b827"},"password_expiration":0,"name":"SpecialPolicy","min_password_length":7,"id":"71a8fcc5-71a8-4db9-8c0f-32bf6782b827","failed_login_attempts":0,"password_history":0}]
(base) Asuka-no-MacBook-Air:~ asaito$ 

```

出力結果からポリシーのidを確認します。以下は「SpecialPolicy」という名前のポリシーの設定情報記載箇所で、"id":の次に記載されている文字列がidになります。(71a8fcc5-71a8-4db9-8c0f-32bf6782b827)

`{"lockout_duration":0,"metadata":{"updated_at":"Thu Dec 20 10:26:22 UTC 2018","guid":"71a8fcc5-71a8-4db9-8c0f-32bf6782b827","created_at":"Thu Dec 20 10:26:22 UTC 2018","url":"\/auth_policies\/71a8fcc5-71a8-4db9-8c0f-32bf6782b827"},"password_expiration":0,"name":"SpecialPolicy","min_password_length":7,"id":"71a8fcc5-71a8-4db9-8c0f-32bf6782b827","failed_login_attempts":0,"password_history":0}`

#####2-2. 更新のAPIをマニュアルで確認する。
これまでとおなじ要領で、APIのマニュアルを確認します。更新はUsersカテゴリーの「PUT」の「/users/{id}」です。「Try it out」と「Execute」をクリックしてサンプルを出力しますが、この時、「Execute」の条件としてidの入力が必須になっているので、入力します。

![cf42c94c57191f80e0a3_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/5cafbe77-16f0-f043-ff44-f1c07a008b9c.png)

```bash:生成されたサンプルのコマンド
curl -X PUT "https://developer.ibm.com/dbapi/v3/users/user26" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"id\": \"string\",  \"name\": \"string\",  \"old_password\": \"string\",  \"new_password\": \"string\",  \"role\": \"bluadmin\",  \"email\": \"string\"}"

```

これを自分の環境の情報に合わせます。最低限指定するものは、

- POST先のURL
- id（のstring部分）修正するユーザーのID
- 修正したい部分

指定しない部分は、サンプルのコマンド文から除きます。
このサンプルでは、policy_idを修正したいと思いますので、コマンドは以下になります。


```bash:POST先のURL、id、policy_idを指定したサンプル
curl -X PUT "https://dashdb-mpp-***.bluemix.net:8443/dbapi/v3/users/user26" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"id\": \"user26\",  \"authentication\": {    \"policy_id\": \"71a8fcc5-71a8-4db9-8c0f-32bf6782b827\"  } }" -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjEyMjczMjksInVzZXJOYW1lIjoiYXNhaXRvIiwiY29va2llIjoiIiwiaXNzdWUiOiJodHRwczovLzEwLjEzMy4yMTguMjMyOjg4ODAvIn0.IrII9WNPNDyd9DJ0_aKrH0Zm6WesIlqdWS89tZi5I_I'

```
#####2-3. 更新のコマンドを実行する。

```bash:実行結果
(base) Asuka-no-MacBook-Air:~ asaito$ curl -X PUT "https://dashdb-mpp-***.bluemix.net:8443/dbapi/v3/users/user26" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"id\": \"user26\",  \"authentication\": {    \"policy_id\": \"71a8fcc5-71a8-4db9-8c0f-32bf6782b827\"  } }" -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjEyMjczMjksInVzZXJOYW1lIjoiYXNhaXRvIiwiY29va2llIjoiIiwiaXNzdWUiOiJodHRwczovLzEwLjEzMy4yMTguMjMyOjg4ODAvIn0.IrII9WNPNDyd9DJ0_aKrH0Zm6WesIlqdWS89tZi5I_I'
{"password":"************************************************************","metadata":{"updated_at":"20190622180059Z","guid":"user26","created_at":"20190622170647Z","url":"https:\/\/dashdb-mpp-***.bluemix.net\/dbapi\/v3\/users\/user26"},"role":"bluuser","name":"user26","id":"user26","locked":"no","email":"***@***.com","authentication":{"method":"internal","policy_id":"71a8fcc5-71a8-4db9-8c0f-32bf6782b827"}}
(base) Asuka-no-MacBook-Air:~ asaito$ 
```
更新ができました。
ブラウザでWebコンソールにログインして確認してみてください。


そのほかのAPIも基本的にサンプルを生成する場合「Try it out」と「Execute」をクリックします。
いろいろなAPIを試してみて、特筆すべきことがあれば、また記事を記載したいと思います。

:cat::cat: