動的認証セレクタ構成が無効であるか、後で複数認証デプロイメントが認証サーバーへのリクエストの照合に失敗します
APIゲートウェイ・サービスを使用してAPIデプロイメントを作成するときに、マルチ認証構成の動的認証セレクタ・エラーおよびリクエスト一致の失敗をトラブルシューティングする方法を確認してください。
APIデプロイメントが複数の認証サーバーを使用し、それらの間で動的に選択する場合、デプロイメント時または実行時に障害が発生する可能性があります。デプロイ時に、APIゲートウェイは無効なセレクタ構成を拒否できます。実行時に、APIゲートウェイはデプロイメントを受け入れることができますが、リクエストと認証サーバーの照合に失敗します。
発生時
次の症状のいずれかまたは両方が現れることがあります。
-
APIゲートウェイは、
Invalid Dynamic Authentication Selectorエラーでデプロイメントを拒否します。 -
デプロイメントは正常に作成されますが、リクエストに一致する認証サーバーがないため、一部のリクエストは後で
401 Unauthorizedを返します。
この問題は、あるルート・パターンのAPIキー認証、別のルート・パターンのOAuth2認証など、様々なリクエスト・パターンに異なる認証方法を使用するデプロイメントで発生することがよくあります。
動的認証の仕組み
動的認証デプロイメントでは、selectionSource.selector値を使用して、各リクエストを処理する認証サーバーを決定します。APIゲートウェイは、リクエストごとに、リクエストからセレクタ値を解決し、その値を構成済の認証サーバー・キーと比較します。
サポートされている次のセレクタ・フォームのいずれかを使用します。
-
request.auth[<key>] -
request.path[<key>] -
request.query[<key>] -
request.headers[<key>] -
request.subdomain[<key>] -
request.host
APIゲートウェイは、セレクタ値を解決した後、一致する認証サーバーを選択します。一致する認証サーバー・キーがない場合、APIゲートウェイはデフォルトの認証サーバー(構成されている場合)を使用します。それ以外の場合、リクエストは401 Unauthorizedで失敗します。
パート1: セレクタが無効なためデプロイメントの作成に失敗する
この失敗は、セレクタ式が無効であり、デプロイメントを作成できない場合に発生します。
この外観
デプロイメントは、次のエラーで拒否されます。
-
Invalid Dynamic Authentication Selector
動作する理由
セレクタ式では、サポートされているセレクタ・フォームと有効なセレクタ構文を使用する必要があります。次のセレクタ例は無効です。
-
random -
request.header[]] -
request.path[path1]*request.path[path2]
これらの構成エラーは、デプロイメントを作成または更新する前に修正する必要があります。
パス・セレクタの要件
request.path[<key>]を使用する場合、<key>値は、ルートで定義されているパス・パラメータの名前である必要があります。
次のルートおよびセレクタでは、同じパス・パラメータ名を使用します。
-
ルート:
/DMPServices/{serviceType} -
セレクタ:
request.path[serviceType]
request.path[/]セレクタは、/がパス・パラメータ名ではないため無効です。
修正方法
無効なセレクタ構文を修正するには、次のチェックを使用します。
-
無効なセレクタを、サポートされているセレクタ・フォームの1つに置き換えます。
-
request.path[<key>]を使用する場合は、ルートで同じ名前付きパス・パラメータを定義します。 -
リクエスト・パターンが安定したパス・パラメータに基づいていない場合は、かわりにヘッダーまたは問合せパラメータ・セレクタを使用します。
パート2: デプロイメントは成功しますが、後でリクエストが一致する認証サーバーなしで失敗する
この失敗は実行時に発生します。デプロイメント構成は有効ですが、受信リクエストでは、構成済の認証サーバーと一致するセレクタ値は生成されません。
この外観
実行時に、リクエストは次のメッセージで失敗します。
-
Request unauthorized as no authentication server matched the request and no default is specified
このメッセージは、APIゲートウェイがデプロイメントに到達したが、リクエストの認証サーバーを選択できなかったことを意味します。
動作する理由
通常、失敗は、最初のリクエストにセレクタ値が存在するが、それ以降のリクエストにはないために発生します。たとえば、初期リクエストには認証サーバーを選択する問合せパラメータが含まれ、後で.jsファイル、.cssファイル、イメージまたはAPIコールをリクエストすると、その問合せパラメータは省略されます。
デフォルトの認証サーバーが構成されていない場合、一致するセレクタ値を含まないリクエストは401 Unauthorizedで失敗します。
CookieとOAuth2の状態の適合方法
CookieおよびOAuth2 stateパラメータは、セッションまたはフロー情報の保持に役立ちますが、通常のフォローアップ・リクエストの実行時セレクタの要件は置換されません。
問合せパラメータ・セレクタの問題
問合せパラメータ・セレクタは、最初のリクエストにセレクタ値が含まれるが、後でリクエストを省略すると失敗する可能性があります。たとえば、.jsファイル、.cssファイル、イメージなどのアセットに対するブラウザ・リクエストには、通常、初期リクエストと同じ問合せパラメータが含まれません。
OAuth2リダイレクトまたはコールバック・ステップ中に、APIゲートウェイはOAuth2 stateパラメータを使用して、そのフローに使用された認証サーバーをリカバリできます。コールバック後も、通常のフォローアップ・リクエストはデプロイメントの認証選択動作と一致する必要があります。
より適切なセレクタを選択する方法
一貫して認証する必要があるすべてのリクエストに存在するセレクタ値を使用します。次のセレクタ・タイプは、多くの場合、問合せパラメータ・セレクタよりも信頼性が高くなります。
-
request.headers[<key>]を使用するリクエスト・ヘッダー。 -
request.path[<key>]を使用する安定したパス・パラメータ。 -
ホストベースの認証の選択が必要な場合は、
request.hostを使用するホスト名。
ブラウザベースのアプリケーションの場合、フォローアップ・リクエストには一貫して同じヘッダーを含めることができるため、リクエスト・ヘッダーは問合せパラメータよりも信頼性が高くなることがよくあります。
ランタイム一致の失敗を修正する方法
ランタイム認証サーバーの一致の失敗を修正するには、次のチェックを使用します。
-
セレクタが後続のリクエストに存在しない問合せパラメータを使用する場合は、ヘッダーまたはパス・パラメータなどの安定したリクエスト値にセレクタを変更します。
-
一部のリクエストでセレクタ値が省略されることが予想される場合は、適切なデフォルトの認証サーバーを構成します。
-
セレクタがパス・パラメータを使用する場合は、後のリクエストに同じパス・パラメータが含まれていることを確認します。
-
アプリケーションでCookieを使用する場合は、セッション継続性のためにのみ使用してください。通常のフォローアップ・リクエストに対して認証サーバーを選択するためにCookieのみに依存しないでください。
確認項目
すでにアクティブなデプロイメントの場合は、成功するリクエストと失敗するリクエストを比較します。次の詳細を確認します。
-
selectionSourceで構成されたセレクタ。 -
成功したリクエストから解決されるセレクタ値。
-
失敗したリクエストから解決されるセレクタ値。
-
セレクタ値が両方のリクエストに存在するかどうか。
-
認証サーバー・キーが各解決済セレクタ値と一致するかどうか。
-
デフォルトの認証サーバーが構成されているかどうか。
ログでの確認事項
実行ログを使用して、障害モードを特定します。
-
Invalid Dynamic Authentication Selectorは、デプロイメント構成の問題を示します。 -
Request unauthorized as no authentication server matched the request and no default is specifiedは、実行時リクエスト一致の問題を示します。
これらの障害モードを個別にトラブルシューティングします。後のリクエストに一致するセレクタ値が含まれていない場合、有効なデプロイメント構成は実行時に引き続き失敗する可能性があります。
修正を検証する
セレクタまたは認証サーバーのマッピングを修正したら、デプロイメントおよびリクエスト・フローを確認します。
-
セレクタ構成が変更された場合は、デプロイメントを再作成または更新します。
-
初期要求を再度送信します。
-
以前に失敗したフォローアップリクエストを送信します。
-
APIゲートウェイがセレクタ構文のデプロイメントを拒否しなくなったことを確認します。
-
認証サーバーがリクエストに一致しなかったため、ランタイム・リクエストが失敗しなくなったことを確認します。
詳細情報
詳細は、次を参照してください: