API Connectで、APIキーを変更する方法

# はじめに & やりたいこと
API 呼び出しの際に、APIキーを用いてアクセス制御を行うことがよく行われています。API Connectでも、APIキー（API Connectでは、クライアントIDとクライアント・シークレットと表現）を用いて、認証、流量制御等を行うことができます。APIキー(クライアントIDとクライアント・シークレット)は、API Connectで自動で生成されます。

このAPIキーを独自に設定したい、あるいはテスト環境で発行されたAPIキーをそのまま本番環境で利用したいなど、APIキーを変更したい場合があります。APIキー(クライアントIDとクライアント・シークレット)を変更する方法を記述します。

APIキーは、開発者ポータルAPIを利用して変更することができます。開発者ポータルAPIに関しては、[API Connectで、公開しているAPIを利用しているアプリケーションの一覧を取得する方法](http://qiita.com/Naomi_Tanaka/items/84511a0b7fae3aeac4c9)に情報があるので、そちらも参照ください。

# 参考
[IBM API Connect V5.0 Knowledge Center : Update application credentials](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.apirest.doc/rest_op_portal_orgs__orgID__apps__appID__credentialsPUT.html)

# 手順
ここでは、APIキーのクライアントIDとクライアント・シークレットは以下に変更することにします。


* クライアントID : id
* クライアント・シークレット : password


[Update application credentials](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.apirest.doc/rest_op_portal_orgs__orgID__apps__appID__credentialsPUT.html)は、APIのエンドポイントに間違いがあるのですが、参考になります。クライアント・シークレットを変更する場合、クライアント・シークレットの前処理と、実際の変更を行う際に必要な情報、製品が内部で持っているIDを取得する必要があります。

1. クライアント・シークレットの前処理
2. ポータルAPIの利用
    * 開発者組織IDを取得
    * アプリケーションID、アプリクリデンシャルIDを取得
    * APIキーを変更する 


## 1. クライアント・シークレットの前処理
クライアント・シークレットの文字列は、SHA256でハッシュし、16進にダンプし、Base64エンコードする必要があります。Macだと以下のような感じで行います。

```
$> echo -n 'password' | shasum -a 256
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8  -

$> echo '5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8' | xxd -r -p | base64
XohImNooBHFR0OVvjcYpJ3NgPQ1qq73WKhHvch0VQtg=
```

## 2. ポータルAPIの利用
### 開発者組織IDを取得
[別記事](http://qiita.com/Naomi_Tanaka/items/84511a0b7fae3aeac4c9)にも記述がありますが、開発者組織IDを取得します。

```
# パラメーターセット
PROVIDER_ORG_NAME=provider # プロバイダー組織の名前
CATALOG_NAME=catalog # カタログの名前
MANAGEMENT_SERVICE_ADDRESS=mgt.test.com # 管理サーバーのアドレス
SYSTEM_USER=systemuser@**.* # システムロールのユーザー
SYSTEM_USER_PWD=******** # システムロールのユーザーのパスワード

curl -k -u cmc/${SYSTEM_USER}:${SYSTEM_USER_PWD} -H "X-IBM-APIManagement-Context: ${PROVIDER_ORG_NAME}.${CATALOG_NAME}" -H 'Content-Type: application/json' -X GET https://${MANAGEMENT_SERVICE_ADDRESS}/v1/portal/orgs
```

```
[
  {
    "roles":[
      "589d13a3e4b0910bcd616e42"
    ],
    "id":"589d13a3e4b0910bcd616e41",
    "name":"dev",
    "url":"https://mgt.test.com/v1/portal/orgs/589d13a3e4b0910bcd616e41",
    "owner":true
  }
]
```

該当の開発者組織名(上の例の場合 dev )の"id"の値が、開発者組織IDです。開発者組織が複数ある場合は、複数表示されるため、名前で確認が必要です。

### アプリケーションID、アプリクリデンシャルIDを取得
次に、該当の開発者組織が保有し、APIキー(クライアントID, クライアント・シークレット)を変更したいアプリケーションIDとアプリクリデンシャルIDを取得します。

```
# パラメーターセット
PROVIDER_ORG_NAME=provider # プロバイダー組織の名前
CATALOG_NAME=catalog # カタログの名前
MANAGEMENT_SERVICE_ADDRESS=mgt.test.com # 管理サーバーのアドレス
SYSTEM_USER=systemuser@**.* # システムロールのユーザー
SYSTEM_USER_PWD=******** # システムロールのユーザーのパスワード
orgID=589d13a3e4b0910bcd616e41 # 開発者組織ID

curl -k -u cmc/${SYSTEM_USER}:${SYSTEM_USER_PWD} -H "X-IBM-APIManagement-Context: ${PROVIDER_ORG_NAME}.${CATALOG_NAME}" -H 'Content-Type: application/json' -X GET https://${MANAGEMENT_SERVICE_ADDRESS}/v1/portal/orgs/${orgID}/apps
```

```
[
  {
    "id":"596ee1d5e4b01755c9dc6c95",
    "name":"ClientSecret",
    "orgID":"589d13a3e4b0910bcd616e41",
    "public":false,
    "description":"",
    "credentials":
      {
        "clientID":"936691a3-ce41-44f9-8879-9631d6ae0e02",
        "clientSecret":"********************************************",
        "description":"Default",
        "url":"https://mgt.test.com/v1/portal/orgs/589d13a3e4b0910bcd616e41/apps/596ee1d5e4b01755c9dc6c95/credentials"
      },
    "appCredentials":[
      {
        "id":"596ee1d5e4b01755c9dc6c96",
        "description":"Default",
        "url":"https://mgt.test.com/v1/portal/orgs/589d13a3e4b0910bcd616e41/apps/596ee1d5e4b01755c9dc6c95/credentials/596ee1d5e4b01755c9dc6c96",
        "clientID":"936691a3-ce41-44f9-8879-9631d6ae0e02",
        "clientSecret":"********************************************"
      }
    ],
    "enabled":true,
    "state":"ACTIVE",
    "imageURL":null,
    "oauthRedirectURI":"",
    "createdAt":"2017-07-19T04:36:37.560+0000",
    "updatedAt":"2017-07-19T04:36:37.560+0000",
    "url":"https://mgt.test.com/v1/portal/orgs/589d13a3e4b0910bcd616e41/apps/596ee1d5e4b01755c9dc6c95"
  }
]
```
該当のアプリケーション名(上の例の場合 ClientSecret)の "id"の値 "596ee1d5e4b01755c9dc6c95"  がアプリケーションIDになります。アプリクリデンシャルIDは、"appCredentials"要素の"id"の値 "596ee1d5e4b01755c9dc6c96" になります。
開発者組織と同じ様に、アプリケーションが複数ある場合は複数表示されるため、アプリケーション名で判別する必要があります。

### APIキーを変更
ここまでの手順で必要な情報が揃ったので、APIキー(クライアントID、クライアント・シークレット)を変更します。

```
# パラメーターセット
PROVIDER_ORG_NAME=provider # プロバイダー組織の名前
CATALOG_NAME=catalog # カタログの名前
MANAGEMENT_SERVICE_ADDRESS=mgt.test.com # 管理サーバーのアドレス
SYSTEM_USER=systemuser@**.* # システムロールのユーザー
SYSTEM_USER_PWD=******** # システムロールのユーザーのパスワード
orgID=589d13a3e4b0910bcd616e41 # 開発者組織ID
appID=596ee1d5e4b01755c9dc6c95 # アプリケーションID
credID=596ee1d5e4b01755c9dc6c96 # アプリクリデンシャルID

curl -k -u cmc/${SYSTEM_USER}:${SYSTEM_USER_PWD} -H "X-IBM-APIManagement-Context: ${PROVIDER_ORG_NAME}.${CATALOG_NAME}" -H 'Content-Type: application/json' -d '{"clientID" : "id", "clientSecret" : "XohImNooBHFR0OVvjcYpJ3NgPQ1qq73WKhHvch0VQtg=", "description" :"" }' -X PUT https://${MANAGEMENT_SERVICE_ADDRESS}/v1/portal/orgs/${orgID}/apps/${appID}/credentials/${credID}
```

```
{
  "id":"596ee1d5e4b01755c9dc6c96",
  "description":"",
  "url":"https://mgt.test.com/v1/portal/orgs/589d13a3e4b0910bcd616e41/apps/596ee1d5e4b01755c9dc6c95/credentials/596ee1d5e4b01755c9dc6c96",
  "clientID":"id",
  "clientSecret":"********************************************"
}
```

これで、APIキー(クライアントID、クライアント・シークレット)の変更は完了しました。


# 変更の確認
クライアント・IDの確認と、クライアント・シークレットの検証は、開発者ポータルでも提供されています。ここでは、開発者ポータルで確認します。コマンドで変更後、開発者ポータルに反映されるのに数分かかる場合があります。
該当のアプリケーションを選択し、クライアントIDの"表示"チェックボックスにチェックを入れるとクライアントIDに関しては確認できます。
![スクリーンショット 2017-07-20 12.01.48.png](https://qiita-image-store.s3.amazonaws.com/0/121209/01843c42-0b9e-1b2c-d640-2c324b7d6aa4.png)


クライアント・シークレットの確認は、"検証"ボタンを押し、クライアント・シークレットの検証が可能です。
![スクリーンショット 2017-07-20 12.03.00.png](https://qiita-image-store.s3.amazonaws.com/0/121209/1a6bef71-0a03-2bc4-aa13-b7efbbf52642.png)

クライアント・シークレットを検証されたことが確認できます。
![スクリーンショット 2017-07-20 12.03.51.png](https://qiita-image-store.s3.amazonaws.com/0/121209/1ff05da1-58f9-ef51-a884-4767138b69e8.png)


開発者ポータルAPIを利用して、APIキー(クライアントID、クライアント・シークレット)の変更を行いました。