概要
IBM API Connectのアセンブリでは、その処理においてエラーが発生した場合にCatchを構成する事で、エラー発生時の挙動をカスタマイズできます。
API Connect V5.0.8.3以降で、ハンドリングできるエラーが追加されています。ここでは、追加された例外の中で、UnauthorizedErrorの挙動を確認してみたいと思います。
アセンブリでサポートされるエラーの一覧
以下が、アセンブリでサポートされるエラーの一覧になります。
例外 | 概要 | 備考 |
---|---|---|
ConnectionError | 別の URL との接続を確立する際にエラーが発生しました。 | |
JavaScriptError | ポリシー内で JavaScript または GatewayScript を実行中にエラーが発生しました。 | |
PropertyError | アクションが設定、追加、クリアされていない状態で、set-variable ポリシーの呼び出し中または実行中に、正しくないプロパティーが原因でエラーが発生しました。 | |
RedactionError | redact ポリシーの一部としてフィールドを編集する際にエラーが発生しました。 | |
TransformError | transformation ポリシーの実行中にエラーが発生しました。 | |
RuntimeError | 上記以外の指定されていないエラーが発生しました。 | |
BadRequestError | An error occurred while trying to access the request. | V5.0.8.3 以降 |
UnauthorizedError | The API cannot be invoked based on the client ID and/or client secret provided, or id/secret were specified in the wrong location. | V5.0.8.3 以降 |
ForbiddenError | The application making the API request has been disabled or is not active. | V5.0.8.3 以降 |
UnAuthorized Errorの構成と実行例
UnAuthorizedError Catchを構成してAPI Callをしてみます。
API定義のアセンブリ画面で、Catchを表示します。
UnAuthorizedError Catchを追加し、GatewayScriptポリシーを配置します。
このGatewayScriptポリシーでは、例として以下のように、ステータスコード、エラーメッセージを設定します。
var obj = {
"status" : "UnauthorizedError Catch ",
"message" : "Response Message"
};
apim.setvariable('message.status.code', '401');
apim.setvariable('message.headers.content-type', 'application/json');
apim.setvariable('message.body', obj);
このような構成をしたAPIを公開し、実際に、クライアントIDの指定を間違えて、APIを呼び出してみます。
- クライアントIDが間違っている場合
curl -i -H "x-ibm-client-id: 3b530653-19f6-4ae0-b727-2a5a87776e8" https://api.au.apiconnect.ibmcloud.com/xxxxx-apic/sb/simple/current
HTTP/1.1 401 Unauthorized
(中略)
content-type: application/json
{"status":"UnauthorizedError Catch ","message":"Response Message"}
- クライアントIDの指定場所が違う場合
curl -k -i https://api.au.apiconnect.ibmcloud.com/xxxxx-apic/sb/simple/current?client_id=3b530653-19f6-4ae0-b727-2a5a87776e8e
HTTP/1.1 401 Unauthorized
(中略)
content-type: application/json
{"status":"UnauthorizedError Catch ","message":"Response Message"}
これにより、クライアントID、クライアントシークレットの値や指定方法が間違った場合のエラーメッセージや挙動をカスタマイズできます。
従来は、DataPower拡張などでの対応が必要でした。
参考までに、catchを構成しない場合のエラー時の応答例は、以下になります。
クライアントIDが間違っている場合
$ curl -i -H "x-ibm-client-id: 3b530653-19f6-4ae0-b727-2a5a87776e8" https://api.au.apiconnect.ibmcloud.com/xxxxx-apic/sb/simple/current
HTTP/1.1 401 Unauthorized
Content-Type: application/json
(省略)
{ "httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Invalid client id or secret." }クライアントIDの指定場所が違う場合
curl -k -i https://api.au.apiconnect.ibmcloud.com/xxxxx-apic/sb/simple/current?client_id=3b530653-19f6-4ae0-b727-2a5a87776e8e
HTTP/1.1 401 Unauthorized
Content-Type: application/json
(省略)
{ "httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Client id in wrong location." }