Spring Security OAuth Login avec WebFlux

Connexion Spring Security OAuth avec WebFlux

1. Vue d'ensemble

Spring Security a ajouté la prise en charge de OAuth pour WebFlux à partir de l’AG 5.1.x.

Nous discuterons dehow to configure our WebFlux application to use OAuth2 Login support. Nous verrons également comment utiliserWebClient pour accéder aux ressources sécurisées OAuth2.

La configuration de la connexion OAuth pour Webflux est similaire à celle d'une application Web MVC standard. Pour plus de détails à ce sujet, consultez également notre article sur lesSpring OAuth2Login element.

2. Configuration Maven

Pour commencer, nous allons créer une application Spring Boot simple et ajouter ces dépendances à nospom.xml:


    org.springframework.boot
    spring-boot-starter-security


    org.springframework.boot
    spring-boot-starter-webflux


    org.springframework.security
    spring-security-oauth2-client

Les dépendancesspring-boot-starter-security,spring-boot-starter-webflux etspring-security-oauth2-client sont disponibles sur Maven Central.

3. Contrôleur principal

Ensuite, nous allons ajouter un contrôleur simple pour afficher le nom d'utilisateur sur la page d'accueil:

@RestController
public class MainController {

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

Notez quewe’ll display the username obtained from OAuth2 client UserInfo endpoint.

4. Connexion à l'aide de Google

Maintenant, nous allons configurer notre application pour prendre en charge la connexion à l'aide de Google.

Tout d'abord, nous devons créer un nouveau projet àGoogle Developer Console

Maintenant, nous devons ajouter des informations d'identification OAuth2 (Créer des informations d'identification> ID client OAuth).

Ensuite, nous ajouterons ceci aux "URI de redirection autorisés":

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

Ensuite,we need to configure our application.yml to use the Client ID and Secret:

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_APP_CLIENT_ID
            client-secret: YOUR_APP_CLIENT_SECRET

Comme nous avonsspring-security-oauth2-client sur notre chemin, notre application sera sécurisée.

Les utilisateurs seront redirigés pour se connecter à l'aide de Google avant de pouvoir accéder à notre page d'accueil.

5. Connexion à l'aide du fournisseur d'authentification

Nous pouvons également configurer notre application pour se connecter à partir d'un serveur d'autorisation personnalisé.

Dans l'exemple suivant, nous utiliserons notre serveur d'autorisation à partir d'unprevious article.

Cette fois, nous devons configurer plus de propriétés, pas seulement le ClientID et le 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

Dans ce cas, nous devons également spécifier lesscope,grant type etredirect URI pour le client OAuth2. Nous fournirons également lesauthorization ettoken URI du serveur d’autorisation.

Enfin, nous devons également configurer le point de terminaisonUserInfo pour pouvoir obtenir les détails d'authentification de l'utilisateur.

6. Configuration de sécurité

Par défaut, Spring Security sécurise tous les chemins. Par conséquent, si nous n'avons qu'un seul client OAuth, nous serons redirigés pour autoriser ce client et nous connecter.

Si plusieurs clients OAuth sont enregistrés, une page de connexion sera automatiquement créée pour choisir la méthode de connexion.

Nous pouvons changer cela si nous aimons etprovide a detailed security configuration:

@EnableWebFluxSecurity
public class SecurityConfig {

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

Dans cet exemple, nous avons sécurisé tous les chemins à l'exception de "/ about".

7. WebClient

Nous pouvons également faire plus que simplement authentifier les utilisateurs à l’aide de OAuth2. We can use WebClient to access OAuth2 secured resources using OAuth2AuthorizedClient.

Maintenant, configurons nosWebClient:

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

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

Ensuite, nous pouvons récupérer une ressource sécurisée OAuth2:

@Autowired
private WebClient webClient;

@GetMapping("/foos/{id}")
public Mono 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);
}

Notez quewe retrieved the remote resource Foo using AccessToken from*OAuth2AuthorizedClient*.

8. Conclusion

Dans cet article rapide, nous avons appris à configurer notre application WebFlux pour utiliser le support de connexion OAuth2 et à utiliser WebClient pour accéder aux ressources sécurisées OAuth2.

Comme toujours, le code source complet est disponibleover on GitHub.