認定クライアント
認可されたクライアントの解決
@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
- アクセストークンはトークンエンドポイントから直接取得されますpassword
- アクセストークンはトークンエンドポイントから直接取得されます
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 リクエストはアクセストークンを受け取るため、この機能には注意が必要です。 |