OAuth 2.0 リソースサーバー

Spring Security は、2 つの形式の OAuth 2.0 ベアラートークン [IETF] (英語) を使用して、エンドポイントの保護をサポートします。

これは、アプリケーションが権限管理を認可サーバー [IETF] (英語) (Okta や Ping Identity など)に委譲している場合に便利です。この認可サーバーは、リソースサーバーがリクエストを認可するために調べることができます。

このセクションでは、Spring Security が OAuth 2.0 ベアラートークン [IETF] (英語) のサポートを提供する方法について詳しく説明します。

これで、Spring Security 内でベアラートークン認証がどのように機能するかを検討できます。まず、基本認証と同様に、WWW 認証 [IETF] (英語) ヘッダーが認証されていないクライアントに返送されることがわかります。

bearerauthenticationentrypoint
図 1: WWW-Authenticate ヘッダーの送信

上の図は、SecurityFilterChain ダイアグラムを基にしています。

number 1 最初に、ユーザーは、ユーザーが認可されていない /private リソースに対して認証されていないリクエストを行います。

number 2Spring Security の AuthorizationFilter は、認証されていないリクエストが AccessDeniedException をスローすることによって拒否されたことを示します。

number 3 ユーザーが認証されていないため、ExceptionTranslationFilter認証開始を開始します。構成された AuthenticationEntryPoint は、WWW-Authenticate ヘッダーを送信する BearerTokenAuthenticationEntryPoint (Javadoc) のインスタンスです。RequestCache は通常、リクエストを保存しない NullRequestCache です。これは、クライアントが最初にリクエストしたリクエストを再生できるためです。

クライアントが WWW-Authenticate: Bearer ヘッダーを受信すると、ベアラートークンを使用して再試行する必要があることがわかります。次のイメージは、処理中のベアラートークンのフローを示しています。

bearertokenauthenticationfilter
図 2: ベアラートークンの認証

この図は、SecurityFilterChain ダイアグラムから構築されています。

number 1 ユーザーがベアラートークンを送信すると、BearerTokenAuthenticationFilter は HttpServletRequest からトークンを抽出して Authentication の一種である BearerTokenAuthenticationToken を作成します。

number 2 次に、HttpServletRequest が AuthenticationManagerResolver に渡され、AuthenticationManagerResolver が AuthenticationManager を選択します。BearerTokenAuthenticationToken は、認証のために AuthenticationManager に渡されます。AuthenticationManager がどのように見えるかの詳細は、JWT または Opaque トークンのどちら用に構成されているかによって異なります。

number 3 認証に失敗した場合、Failure

  • SecurityContextHolder はクリアされます。

  • AuthenticationEntryPoint が呼び出され、WWW-Authenticate ヘッダーが再度送信されるようトリガーします。

number 4 認証が成功した場合は、Success .

  • 認証SecurityContextHolder に設定されます。

  • BearerTokenAuthenticationFilter は FilterChain.doFilter(request,response) を呼び出して、残りのアプリケーションロジックを続行します。