はじめに & やりたいこと
API 呼び出しの際に、APIキーを用いてアクセス制御を行うことがよく行われています。API Connectでも、APIキー(API Connectでは、クライアントIDとクライアント・シークレットと表現)を用いて、認証、流量制御等を行うことができます。APIキー(クライアントIDとクライアント・シークレット)は、API Connectで自動で生成されます。
このAPIキーを独自に設定したい、あるいはテスト環境で発行されたAPIキーをそのまま本番環境で利用したいなど、APIキーを変更したい場合があります。APIキー(クライアントIDとクライアント・シークレット)を変更する方法を記述します。
APIキーは、開発者ポータルAPIを利用して変更することができます。開発者ポータルAPIに関しては、API Connectで、公開しているAPIを利用しているアプリケーションの一覧を取得する方法に情報があるので、そちらも参照ください。
参考
IBM API Connect V5.0 Knowledge Center : Update application credentials
手順
ここでは、APIキーのクライアントIDとクライアント・シークレットは以下に変更することにします。
- クライアントID : id
- クライアント・シークレット : password
Update application credentialsは、APIのエンドポイントに間違いがあるのですが、参考になります。クライアント・シークレットを変更する場合、クライアント・シークレットの前処理と、実際の変更を行う際に必要な情報、製品が内部で持っているIDを取得する必要があります。
- クライアント・シークレットの前処理
- ポータル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を取得
別記事にも記述がありますが、開発者組織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に関しては確認できます。
クライアント・シークレットの確認は、"検証"ボタンを押し、クライアント・シークレットの検証が可能です。
開発者ポータルAPIを利用して、APIキー(クライアントID、クライアント・シークレット)の変更を行いました。