1概要

Spring Securityは5.1.x GAからWebFluxのOAuthサポートを追加しました。

  • OAuth2ログインサポートを使用するようにWebFluxアプリケーションを設定する方法** について説明します。また、

    WebClient

    を使用してOAuth 2のセキュリティで保護されたリソースにアクセスする方法についても説明します。

WebfluxのOAuthログイン設定は、標準のWeb MVCアプリケーションのものと似ています。この詳細については、https://www.baeldung.com/spring-security-5-oauth2-login[Spring

OAuth2Login

element]に関する記事もご覧ください。


2 Mavenの設定

まず、簡単なSpring Bootアプリケーションを作成し、これらの依存関係を

pom.xml

に追加します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-client</artifactId>
</dependency>


spring-boot-starter-security

、https://検索。 maven.org/search?q=a:spring-boot-starter-webflux[spring-boot-starter-webflux]およびhttps://search.maven.org/search?q=a:spring-security-oauth2-client %20AND%20g:org.springframework.security[spring-security-oauth2-client]依存関係はMaven Centralで利用可能です。


3メインコントローラー

次に、ホームページにユーザー名を表示するための簡単なコントローラを追加します。

@RestController
public class MainController {

    @GetMapping("/")
    public Mono<String> index(@AuthenticationPrincipal Mono<OAuth2User> oauth2User) {
       return oauth2User
        .map(OAuth2User::getName)
        .map(name -> String.format("Hi, %s", name));
    }
}

  • OAuth 2クライアント

    UserInfo

    エンドポイント** から取得したユーザー名を表示します。


4 Google

を使用したログイン

これで、Googleを使用したログインをサポートするようにアプリケーションを設定します。

まず、https://console.developers.google.com[Googleデベロッパーコンソール]で新しいプロジェクトを作成する必要があります。

それでは、OAuth2認証情報を追加する必要があります([認証情報]>[OAuthクライアントID])。

次に、これを「承認されたリダイレクトURI」に追加します。

http://localhost:8080/login/oauth2/code/google

それから、クライアントIDとシークレットを使用するように

application.yml

を設定する必要があります。

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR__APP__CLIENT__ID
            client-secret: YOUR__APP__CLIENT__SECRET

私たちのパスに

spring-security-oauth2-client

があるので、私たちのアプリケーションは保護されます。

ユーザーは、Googleにアクセスする前に、Googleを使用してログインするようにリダイレクトされます。


5認証プロバイダを使用したログイン

カスタム認証サーバからログインするようにアプリケーションを設定することもできます。

次の例では、https://www.baeldung.com/rest-api-spring-oauth2-angularjs[以前の記事]から認証サーバーを使用します。

今回は、ClientIDとClient Secretだけでなく、もっと多くのプロパティを設定する必要があります。

spring:
  security:
    oauth2:
      client:
        registration:
          custom:
            client-id: fooClientIdPassword
            client-secret: secret
            scopes: read,foo
            authorization-grant-type: authorization__code
            redirect-uri-template: http://localhost:8080/login/oauth2/code/custom
        provider:
          custom:
            authorization-uri: http://localhost:8081/spring-security-oauth-server/oauth/authorize
            token-uri: http://localhost:8081/spring-security-oauth-server/oauth/token
            user-info-uri: http://localhost:8088/spring-security-oauth-resource/users/extra
            user-name-attribute: user__name

この場合、OAuth2クライアントの

scope、


Grant type

、および

redirect URI

も指定する必要があります。認可サーバーの

authorization



token URI

も提供します。

最後に、ユーザー認証の詳細を取得できるように、

UserInfo

エンドポイントも構成する必要があります。


6. セキュリティ設定

デフォルトでは、Spring Securityはすべてのパスを保護します。したがって、OAuthクライアントが1つしかない場合は、このクライアントを認証してログインするようにリダイレクトされます。

複数のOAuthクライアントが登録されている場合は、ログイン方法を選択するためのログインページが自動的に作成されます。

私たちが好きなら

詳細なセキュリティ設定を提供するなら

これを変更することができます。

@EnableWebFluxSecurity
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain configure(ServerHttpSecurity http) throws Exception {
        return http.authorizeExchange()
          .pathMatchers("/about").permitAll()
          .anyExchange().authenticated()
          .and().oauth2Login()
          .and().build();
    }
}

この例では、「/about」以外のすべてのパスを保護しました。


7.

WebClient


OAuth2を使用してユーザーを認証するだけではありません。


OAuth2AuthorizedClient


を使用してOAuth2の保護されたリソースにアクセスするには、

WebClient

を使用できます。

それでは、WebClientを設定しましょう。

@Bean
public WebClient webClient(ReactiveClientRegistrationRepository clientRegistrationRepo,
  ServerOAuth2AuthorizedClientRepository authorizedClientRepo) {
    ServerOAuth2AuthorizedClientExchangeFilterFunction filter =
      new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepo, authorizedClientRepo);

    return WebClient.builder().filter(filter).build();
}

その後、OAuth2の保護されたリソースを取得できます。

@Autowired
private WebClient webClient;

@GetMapping("/foos/{id}")
public Mono<Foo> getFooResource(@RegisteredOAuth2AuthorizedClient("custom")
  OAuth2AuthorizedClient client, @PathVariable final long id){
    return webClient
      .get()
      .uri("http://localhost:8088/spring-security-oauth-resource/foos/{id}", id)
      .attributes(oauth2AuthorizedClient(client))
      .retrieve()
      .bodyToMono(Foo.class);
}

  • 私たちは




    OAuth2AuthorizedClient ** .から

    AccessToken

    を使ってリモートリソース

    Foo

    を取得したことに注意してください。


8結論

この簡単な記事では、OAuth2ログインサポートを使用するようにWebFluxアプリケーションを構成する方法と、OAuth2の保護されたリソースにアクセスするためにWebClientを使用する方法を学びました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-5-reactive-oauth[over on GitHub]から入手可能です。