API Connect v2018におけるAPIキー作成・変更方法 - Developer Toolkit編 -

# はじめに
API Connect v2018では、APIキー（クライアントID/クライアント・シークレット）を変更する方法として以下の2通りあります。

1. Developer Toolkit CLI (apicコマンド) を使用する方法
2. API Connect REST API を使用する方法

ここでは、「1. Developer Toolkit CLI を使用する方法」について紹介します。

「2. API Connect REST API を使用する方法」については、[API Connect v2018におけるAPIキー作成・変更方法 - API Connect REST API編 -](https://qiita.com/jiszk/items/65c21ea613484a8b0bb2) を参照してください。

また、API Connect v5におけるAPIキーの変更方法については、[API Connectで、APIキーを変更する方法](https://qiita.com/uedatks/items/d183adc3b89bd14d7048) で紹介されています。

# 環境
API Connect v2018.4.1.6

# 事前準備
クライアント (win/mac/linux) にDeveloper Toolkitを導入し、apicコマンドが実行可能である必要があります。
Developer Toolkitの導入方法については [API Connect v2018で新しくなったDeveloper Toolkit](https://qiita.com/uedatks/items/94ca1ad5629aa9002f3a) を参考にします。

ここでは、linux版を使用します。

```
$ ./apic version
APIConnect toolkit 4b1fa55baea5706766b9e53cba29a6c4b630e96a (Built 2019-06-13T20:33:34Z) (Tag o.6750235-g.4b1fa55)
```

# 手順
以下の手順で新規アプリケーションを作成し、クライアントID/クライアント・シークレットを変更します。
既に作成済みアプリケーションのクライアントID/クライアント・シークレットを変更する場合は 手順2. はスキップしてください。

1. カタログ設定の変更
2. アプリケーション新規作成
3. クライアントID/クライアント・シークレット変更


## 1. カタログ設定の変更
クライアント・シークレットを変更するためには、事前にカタログ設定で "hash_client_secret" パラメーターをtrueにする必要があります。 (デフォルトはfalse)

API Managerにログインします。
(apim-admin はプロバイダー組織所有者)

```
$ ./apic login -u apim-admin -r provider/default-idp-2 -s api-manager-ui.mgmt01.api.local
API Connect の資格情報を入力してください
パスワードを入力してください:
api-manager-ui.mgmt01.api.local に正常にログインしました
```

<details><summary>レルムの確認方法</summary>
レルムは以下のコマンドで確認可能です。<div>

```
$ ./apic identity-providers:list -s api-manager-ui.mgmt01.api.local --scope provider
default-idp-2
```
</div></details>

　
カタログ設定情報を取得し、現在のカタログ設定を確認します。
org01 はプロバイダー組織名、openapi はカタログ名です。

```
$ ./apic catalog-settings:get -o org01 -c openapi -s api-manager-ui.mgmt01.api.local
catalog-setting   catalog-setting.yaml   https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/settings
```
``` catalog-setting.yaml
type: catalog_setting
api_version: 2.0.0
name: catalog-setting
application_lifecycle:
  enabled: false
consumer_self_service_onboarding: true
custom_notification_templates_enabled: false
email_sender:
  custom: false
hash_client_secret: false
invitation_ttl: 172800
portal:
  type: drupal
  endpoint: 'https://www.portal01.api.local/org01/openapi'
  portal_service_url: >-
    https://api-manager-ui.mgmt01.api.local/api/orgs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/portal-services/9ac15b13-fdca-4d82-8d41-eb8a2251f7e6
  webhook_url: >-
    https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/webhooks/748f4d91-b757-4ec8-aabd-acdafbdb38ca
production_mode: false
spaces_enabled: false
task_self_approval: false
user_registry_default_url: >-
  https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/configured-catalog-user-registries/27a2aa9a-eef1-4c93-b312-91584241f671
vanity_api_endpoint:
  enabled: false
  vanity_api_base_endpoints: []
created_at: '2019-07-08T04:53:38.670Z'
updated_at: '2019-07-11T09:26:45.071Z'
org_url: >-
  https://api-manager-ui.mgmt01.api.local/api/orgs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8
catalog_url: >-
  https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9
url: >-
  https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/settings
```

"hash_client_secret" をtrueに変更するためのyamlファイルを作成します。

``` change-catalog-setting.yaml
hash_client_secret: true
```

カタログ設定変更を実行します。

```
$ ./apic catalog-settings:update -o org01 -c openapi -s api-manager-ui.mgmt01.api.local change-catalog-setting.yaml
catalog-setting   https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/settings
```


## 2. アプリケーション新規作成
アプリケーション作成に必要な情報を記載したyamlファイルを作成します。

``` app01.yaml
type: app
api_version: 2.0.0
name: app01
title: App01
state: enabled
lifecycle_state: production
redirect_endpoints:
  - 'https://localhost'
```

アプリケーション作成を実行します。
dev01 は開発者組織名です。

```
$ ./apic apps:create -o org01 -c openapi --consumer-org dev01 -s api-manager-ui.mgmt01.api.local create-app01.yaml
app01    [state: enabled]   https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807
```

作成したアプリケーション情報を取得します。

```
$ ./apic apps:get -o org01 -c openapi --consumer-org dev01 -s api-manager-ui.mgmt01.api.local app01
app01   app01.yaml   https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807
```

``` app01.yaml
type: app
api_version: 2.0.0
id: b50c6d92-d787-486c-a1fd-d4efda8f1807
name: app01
title: App01
state: enabled
lifecycle_state: production
app_credential_urls:
  - >-
    https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807/credentials/a9d4eac3-9a62-4a08-a5a3-dc2e7b0f9ef3
redirect_endpoints:
  - 'https://localhost'
created_at: '2019-07-25T09:40:05.698Z'
updated_at: '2019-07-25T09:40:05.919Z'
org_url: >-
  https://api-manager-ui.mgmt01.api.local/api/orgs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8
catalog_url: >-
  https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9
consumer_org_url: >-
  https://api-manager-ui.mgmt01.api.local/api/consumer-orgs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a
url: >-
  https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807
```

## 3. クライアントID/クライアント・シークレット変更

アプリケーション作成時に自動生成されたクレデンシャル名を確認します。
自動生成されるクレデンシャルの命名規則は「credential-for-<*アプリケーション名*>」です。

```
$ ./apic credentials:list -a app01 -o org01 -c openapi --consumer-org dev01 -s api-manager-ui.mgmt01.api.local
credential-for-app01   https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807/credentials/a9d4eac3-9a62-4a08-a5a3-dc2e7b0f9ef3
```

クレデンシャル名を指定してクレデンシャル情報を取得します。

```
$ ./apic credentials:get -a app01 -o org01 -c openapi --consumer-org dev01 -s api-manager-ui.mgmt01.api.local credential-for-app01
credential-for-app01   credential-for-app01.yaml   https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807/credentials/a9d4eac3-9a62-4a08-a5a3-dc2e7b0f9ef3
```
``` credential-for-app01.yaml
type: credential
api_version: 2.0.0
id: a9d4eac3-9a62-4a08-a5a3-dc2e7b0f9ef3
name: credential-for-app01
title: Credential for App01
summary: Credential for App01
client_id: d20721757e09961c8313583e1ff4c1b9
client_secret_hashed: exQ7BxNb1++qQRtu3v7uypYB4uewiU5+SpIv1mq0Jek=
created_at: '2019-07-25T09:40:05.801Z'
updated_at: '2019-07-25T09:40:05.801Z'
org_url: >-
  https://api-manager-ui.mgmt01.api.local/api/orgs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8
catalog_url: >-
  https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9
consumer_org_url: >-
  https://api-manager-ui.mgmt01.api.local/api/consumer-orgs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a
app_url: >-
  https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807
url: >-
  https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807/credentials/a9d4eac3-9a62-4a08-a5a3-dc2e7b0f9ef3
```

クライアントID/クライアント・シークレットを変更するためのyamlファイルを作成します。

``` change-cred-for-app01.yaml
client_id: client-id-for-app01
client_secret: client-secret-for-app01
```

クレデンシャルの変更を実行します。

```
$ ./apic credentials:update -a app01 -o org01 -c openapi --consumer-org dev01 -s api-manager-ui.mgmt01.api.local credential-for-app01 change-cred-for-app01.yaml
credential-for-app01   https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807/credentials/a9d4eac3-9a62-4a08-a5a3-dc2e7b0f9ef3
```

再度アプリケーションのクレデンシャルを取得して、クライアントID/クライアント・シークレットが変更されていることを確認します。
※ クライアント・シークレットはハッシュ化されます。

``` credential-for-app01.yaml
type: credential
api_version: 2.0.0
id: a9d4eac3-9a62-4a08-a5a3-dc2e7b0f9ef3
name: credential-for-app01
title: Credential for App01
summary: Credential for App01
client_id: client-id-for-app01
client_secret_hashed: HJIRnovqqqMMIKPJtVAuZ2SfS+GgWPhCoag40RrrKGU=
created_at: '2019-07-25T09:40:05.801Z'
updated_at: '2019-07-25T10:00:31.169Z'
org_url: >-
  https://api-manager-ui.mgmt01.api.local/api/orgs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8
catalog_url: >-
  https://api-manager-ui.mgmt01.api.local/api/catalogs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9
consumer_org_url: >-
  https://api-manager-ui.mgmt01.api.local/api/consumer-orgs/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a
app_url: >-
  https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807
url: >-
  https://api-manager-ui.mgmt01.api.local/api/apps/0007cb5d-1eaf-4716-b77d-eba652aa8ed8/3980e0a4-83f5-4305-a67c-701b626cffc9/7b595023-af90-468b-9542-1b705c9be05a/b50c6d92-d787-486c-a1fd-d4efda8f1807/credentials/a9d4eac3-9a62-4a08-a5a3-dc2e7b0f9ef3
```