背景
ここで紹介したデザインを実装したい記事。
- クライアントはまずIDP(OpenID Connect/OAuth2)で認証します。
- IDPはアクセストークン(ユーザー情報のない不透明なトークン)を返します。
- クライアントは、Authorizationヘッダーのアクセストークンを使用してAPIゲートウェイを介して呼び出しを行います。
- APIゲートウェイはアクセストークンを使用してIDPにリクエストを送信します。
- IDPはアクセストークンが有効であることを確認し、JSON形式でユーザー情報を返します。
- APIゲートウェイはユーザー情報をJWTに保存し、秘密鍵で署名します。その後、JWTは下流のサービスに渡され、そこで公開鍵を使用してJWTが検証されます。
- サービスがリクエストを満たすために別のサービスを呼び出す必要がある場合、リクエストの認証と承認として機能するJWTを渡します。
これまでのところ
私はその大部分を以下を使用して行いました:
- グローバルフレームワークとしてのSpring Cloud
- 個別のサービスを立ち上げるためのSpring Boot
- APIゲートウェイとしてのNetflix Zuul
また、アクセス トークンをチェックし、IDP に接続して JWT を作成する Zuul PRE フィルターも作成しました。その後、JWT はダウンストリーム サービスに転送されるリクエストのヘッダーに追加されます。
問題
私の質問は、Zuul とそのフィルターに特有のものです。何らかの理由で API ゲートウェイで認証が失敗した場合、フィルター チェーンを続行して呼び出しを転送せずに、ルーティングを停止して 401 で直接応答するにはどうすればよいですか?
現時点では、認証が失敗した場合、フィルターはヘッダーに JWT を追加せず、ダウンストリーム サービスから 401 が送信されます。ゲートウェイがこの不要な呼び出しを防止できることを期待していました。
これをどうやって実行できるか調べてみましたcom.netflix.zuul.context.RequestContext
が、ドキュメントが非常に貧弱で、方法を見つけることができませんでした。
ベストアンサー1
setSendZuulResponse(false)
現在のコンテキストで設定を試すことができます。これにより、リクエストがルーティングされることはありません。removeRouteHost()
コンテキストから呼び出すこともできます。これにより、同じことが実現されます。401 ステータス コードを設定するために を使用できますsetResponseStatusCode
。