最新の安定バージョンについては、Spring Security 6.3.1 を使用してください!

認可されたクライアント機能

認可されたクライアントの解決

@RegisteredOAuth2AuthorizedClient アノテーションは、メソッドパラメーターを型 OAuth2AuthorizedClient の引数値に解決する機能を提供します。これは、OAuth2AuthorizedClientManager または OAuth2AuthorizedClientService を使用して OAuth2AuthorizedClient にアクセスするのに比べて、便利な代替手段です。

  • Java

  • Kotlin

@Controller
public class OAuth2ClientController {

	@GetMapping("/")
	public String index(@RegisteredOAuth2AuthorizedClient("okta") OAuth2AuthorizedClient authorizedClient) {
		OAuth2AccessToken accessToken = authorizedClient.getAccessToken();

		...

		return "index";
	}
}
@Controller
class OAuth2ClientController {
    @GetMapping("/")
    fun index(@RegisteredOAuth2AuthorizedClient("okta") authorizedClient: OAuth2AuthorizedClient): String {
        val accessToken = authorizedClient.accessToken

        ...

        return "index"
    }
}

@RegisteredOAuth2AuthorizedClient アノテーションは OAuth2AuthorizedClientArgumentResolver によって処理されます。OAuth2AuthorizedClientArgumentResolverOAuth2AuthorizedClientManager を直接使用するため、その機能を継承します。

サーブレット環境の WebClient 統合

OAuth 2.0 クライアントサポートは、ExchangeFilterFunction を使用して WebClient と統合します。

ServletOAuth2AuthorizedClientExchangeFilterFunction は、OAuth2AuthorizedClient を使用し、関連する OAuth2AccessToken をベアラートークンとして含めることにより、保護されたリソースをリクエストするためのシンプルなメカニズムを提供します。OAuth2AuthorizedClientManager を直接使用するため、次の機能を継承します。

  • クライアントがまだ認可されていない場合、OAuth2AccessToken がリクエストされます。

    • authorization_code - フローを開始するために認可リクエストリダイレクトをトリガーします

    • client_credentials - アクセストークンはトークンエンドポイントから直接取得されます

    • password - アクセストークンはトークンエンドポイントから直接取得されます

  • OAuth2AccessToken の有効期限が切れている場合、OAuth2AuthorizedClientProvider が認可を実行できる場合、リフレッシュ(またはリフレッシュ)されます。

次のコードは、OAuth 2.0 クライアントサポートを使用して WebClient を構成する方法の例を示しています。

  • Java

  • Kotlin

@Bean
WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
	ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
			new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
	return WebClient.builder()
			.apply(oauth2Client.oauth2Configuration())
			.build();
}
@Bean
fun webClient(authorizedClientManager: OAuth2AuthorizedClientManager?): WebClient {
    val oauth2Client = ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager)
    return WebClient.builder()
            .apply(oauth2Client.oauth2Configuration())
            .build()
}

認定クライアントの提供

ServletOAuth2AuthorizedClientExchangeFilterFunction は、ClientRequest.attributes() (リクエスト属性)から OAuth2AuthorizedClient を解決することにより、(リクエストに)使用するクライアントを決定します。

次のコードは、OAuth2AuthorizedClient をリクエスト属性として設定する方法を示しています。

  • Java

  • Kotlin

@GetMapping("/")
public String index(@RegisteredOAuth2AuthorizedClient("okta") OAuth2AuthorizedClient authorizedClient) {
	String resourceUri = ...

	String body = webClient
			.get()
			.uri(resourceUri)
			.attributes(oauth2AuthorizedClient(authorizedClient))   (1)
			.retrieve()
			.bodyToMono(String.class)
			.block();

	...

	return "index";
}
@GetMapping("/")
fun index(@RegisteredOAuth2AuthorizedClient("okta") authorizedClient: OAuth2AuthorizedClient): String {
    val resourceUri: String = ...
    val body: String = webClient
            .get()
            .uri(resourceUri)
            .attributes(oauth2AuthorizedClient(authorizedClient)) (1)
            .retrieve()
            .bodyToMono()
            .block()

    ...

    return "index"
}
1oauth2AuthorizedClient() は ServletOAuth2AuthorizedClientExchangeFilterFunction の static メソッドです。

次のコードは、ClientRegistration.getRegistrationId() をリクエスト属性として設定する方法を示しています。

  • Java

  • Kotlin

@GetMapping("/")
public String index() {
	String resourceUri = ...

	String body = webClient
			.get()
			.uri(resourceUri)
			.attributes(clientRegistrationId("okta"))   (1)
			.retrieve()
			.bodyToMono(String.class)
			.block();

	...

	return "index";
}
@GetMapping("/")
fun index(): String {
    val resourceUri: String = ...

    val body: String = webClient
            .get()
            .uri(resourceUri)
            .attributes(clientRegistrationId("okta"))  (1)
            .retrieve()
            .bodyToMono()
            .block()

    ...

    return "index"
}
1clientRegistrationId() は ServletOAuth2AuthorizedClientExchangeFilterFunction の static メソッドです。

承認済みクライアントのデフォルト設定

OAuth2AuthorizedClient または ClientRegistration.getRegistrationId() のいずれもリクエスト属性として提供されない場合、ServletOAuth2AuthorizedClientExchangeFilterFunction はその構成に応じて、使用するデフォルトクライアントを決定できます。

setDefaultOAuth2AuthorizedClient(true) が構成され、ユーザーが HttpSecurity.oauth2Login() を使用して認証した場合、現在の OAuth2AuthenticationToken に関連付けられた OAuth2AccessToken が使用されます。

次のコードは、特定の構成を示しています。

  • Java

  • Kotlin

@Bean
WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
	ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
			new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
	oauth2Client.setDefaultOAuth2AuthorizedClient(true);
	return WebClient.builder()
			.apply(oauth2Client.oauth2Configuration())
			.build();
}
@Bean
fun webClient(authorizedClientManager: OAuth2AuthorizedClientManager?): WebClient {
    val oauth2Client = ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager)
    oauth2Client.setDefaultOAuth2AuthorizedClient(true)
    return WebClient.builder()
            .apply(oauth2Client.oauth2Configuration())
            .build()
}
すべての HTTP リクエストはアクセストークンを受け取るため、この機能には注意が必要です。

あるいは、setDefaultClientRegistrationId("okta") が有効な ClientRegistration で構成されている場合、OAuth2AuthorizedClient に関連付けられた OAuth2AccessToken が使用されます。

次のコードは、特定の構成を示しています。

  • Java

  • Kotlin

@Bean
WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
	ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
			new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
	oauth2Client.setDefaultClientRegistrationId("okta");
	return WebClient.builder()
			.apply(oauth2Client.oauth2Configuration())
			.build();
}
@Bean
fun webClient(authorizedClientManager: OAuth2AuthorizedClientManager?): WebClient {
    val oauth2Client = ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager)
    oauth2Client.setDefaultClientRegistrationId("okta")
    return WebClient.builder()
            .apply(oauth2Client.oauth2Configuration())
            .build()
}
すべての HTTP リクエストはアクセストークンを受け取るため、この機能には注意が必要です。