このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Security 6.5.6 を使用してください! |
認可されたクライアント機能
このセクションでは、OAuth2 クライアント用に Spring Security が提供する追加機能について説明します。
承認済みクライアントの解決
@RegisteredOAuth2AuthorizedClient アノテーションは、メソッドパラメーターを型 OAuth2AuthorizedClient の引数値に解決する機能を提供します。これは、ReactiveOAuth2AuthorizedClientManager または ReactiveOAuth2AuthorizedClientService を使用して OAuth2AuthorizedClient にアクセスするのに比べて、便利な代替手段です。
Java
Kotlin
@Controller
public class OAuth2ClientController {
@GetMapping("/")
public Mono<String> index(@RegisteredOAuth2AuthorizedClient("okta") OAuth2AuthorizedClient authorizedClient) {
return Mono.just(authorizedClient.getAccessToken())
...
.thenReturn("index");
}
}
@Controller
class OAuth2ClientController {
@GetMapping("/")
fun index(@RegisteredOAuth2AuthorizedClient("okta") authorizedClient: OAuth2AuthorizedClient): Mono<String> {
return Mono.just(authorizedClient.accessToken)
...
.thenReturn("index")
}
}
@RegisteredOAuth2AuthorizedClient アノテーションは OAuth2AuthorizedClientArgumentResolver によって処理されます。OAuth2AuthorizedClientArgumentResolver は ReactiveOAuth2AuthorizedClientManager を直接使用するため、その機能を継承します。
リアクティブ環境向けの WebClient 統合
OAuth 2.0 クライアントサポートは、ExchangeFilterFunction を使用して WebClient と統合します。
ServerOAuth2AuthorizedClientExchangeFilterFunction は、OAuth2AuthorizedClient を使用し、関連する OAuth2AccessToken をベアラートークンとして含めることにより、保護されたリソースをリクエストするためのシンプルなメカニズムを提供します。ReactiveOAuth2AuthorizedClientManager を直接使用するため、次の機能を継承します。
クライアントがまだ認可されていない場合、
OAuth2AccessTokenがリクエストされます。authorization_code- フローを開始するために認可リクエストリダイレクトをトリガーしますclient_credentials- アクセストークンはトークンエンドポイントから直接取得されます
OAuth2AccessTokenの有効期限が切れている場合、認証を実行するためにReactiveOAuth2AuthorizedClientProviderが使用可能であれば、OAuth2AccessTokenはリフレッシュ(またはリフレッシュ)されます。
次のコードは、OAuth 2.0 クライアントサポートを使用して WebClient を構成する方法の例を示しています。
Java
Kotlin
@Bean
WebClient webClient(ReactiveOAuth2AuthorizedClientManager authorizedClientManager) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
return WebClient.builder()
.filter(oauth2Client)
.build();
}
@Bean
fun webClient(authorizedClientManager: ReactiveOAuth2AuthorizedClientManager): WebClient {
val oauth2Client = ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager)
return WebClient.builder()
.filter(oauth2Client)
.build()
}
認定クライアントの提供
ServerOAuth2AuthorizedClientExchangeFilterFunction は、ClientRequest.attributes() (リクエスト属性)から OAuth2AuthorizedClient を解決することにより、(リクエストに)使用するクライアントを決定します。
次のコードは、OAuth2AuthorizedClient をリクエスト属性として設定する方法を示しています。
Java
Kotlin
@GetMapping("/")
public Mono<String> index(@RegisteredOAuth2AuthorizedClient("okta") OAuth2AuthorizedClient authorizedClient) {
String resourceUri = ...
return webClient
.get()
.uri(resourceUri)
.attributes(oauth2AuthorizedClient(authorizedClient)) (1)
.retrieve()
.bodyToMono(String.class)
...
.thenReturn("index");
}
@GetMapping("/")
fun index(@RegisteredOAuth2AuthorizedClient("okta") authorizedClient: OAuth2AuthorizedClient): Mono<String> {
val resourceUri: String = ...
return webClient
.get()
.uri(resourceUri)
.attributes(oauth2AuthorizedClient(authorizedClient)) (1)
.retrieve()
.bodyToMono<String>()
...
.thenReturn("index")
}
| 1 | oauth2AuthorizedClient() は ServerOAuth2AuthorizedClientExchangeFilterFunction の static メソッドです。 |
次のコードは、ClientRegistration.getRegistrationId() をリクエスト属性として設定する方法を示しています。
Java
Kotlin
@GetMapping("/")
public Mono<String> index() {
String resourceUri = ...
return webClient
.get()
.uri(resourceUri)
.attributes(clientRegistrationId("okta")) (1)
.retrieve()
.bodyToMono(String.class)
...
.thenReturn("index");
}
@GetMapping("/")
fun index(): Mono<String> {
val resourceUri: String = ...
return webClient
.get()
.uri(resourceUri)
.attributes(clientRegistrationId("okta")) (1)
.retrieve()
.bodyToMono<String>()
...
.thenReturn("index")
}
| 1 | clientRegistrationId() は ServerOAuth2AuthorizedClientExchangeFilterFunction の static メソッドです。 |
承認済みクライアントのデフォルト設定
OAuth2AuthorizedClient または ClientRegistration.getRegistrationId() のいずれもリクエスト属性として提供されない場合、ServerOAuth2AuthorizedClientExchangeFilterFunction はその構成に応じて、使用するデフォルトクライアントを決定できます。
setDefaultOAuth2AuthorizedClient(true) が構成され、ユーザーが ServerHttpSecurity.oauth2Login() を使用して認証した場合、現在の OAuth2AuthenticationToken に関連付けられた OAuth2AccessToken が使用されます。
次のコードは、特定の構成を示しています。
Java
Kotlin
@Bean
WebClient webClient(ReactiveOAuth2AuthorizedClientManager authorizedClientManager) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
oauth2Client.setDefaultOAuth2AuthorizedClient(true);
return WebClient.builder()
.filter(oauth2Client)
.build();
}
@Bean
fun webClient(authorizedClientManager: ReactiveOAuth2AuthorizedClientManager): WebClient {
val oauth2Client = ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager)
oauth2Client.setDefaultOAuth2AuthorizedClient(true)
return WebClient.builder()
.filter(oauth2Client)
.build()
}
すべての HTTP リクエストはアクセストークンを受け取るため、この機能には注意が必要です。 |
あるいは、setDefaultClientRegistrationId("okta") が有効な ClientRegistration で構成されている場合、OAuth2AuthorizedClient に関連付けられた OAuth2AccessToken が使用されます。
次のコードは、特定の構成を示しています。
Java
Kotlin
@Bean
WebClient webClient(ReactiveOAuth2AuthorizedClientManager authorizedClientManager) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
oauth2Client.setDefaultClientRegistrationId("okta");
return WebClient.builder()
.filter(oauth2Client)
.build();
}
@Bean
fun webClient(authorizedClientManager: ReactiveOAuth2AuthorizedClientManager): WebClient {
val oauth2Client = ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager)
oauth2Client.setDefaultClientRegistrationId("okta")
return WebClient.builder()
.filter(oauth2Client)
.build()
}
すべての HTTP リクエストはアクセストークンを受け取るため、この機能には注意が必要です。 |