Login OAuth do Spring Security com WebFlux

Login OAuth do Spring Security com WebFlux

1. Visão geral

A Spring Security adicionou suporte ao OAuth para WebFlux, começando com o 5.1.x GA.

Discutiremoshow to configure our WebFlux application to use OAuth2 Login support. Também discutiremos como usarWebClient para acessar recursos protegidos OAuth2.

A configuração de logon do OAuth para Webflux é semelhante à configuração de um aplicativo Web MVC padrão. Para obter mais detalhes sobre isso, dê uma olhada em nosso artigo emSpring OAuth2Login element.

2. Configuração do Maven

Para começar, criaremos um aplicativo Spring Boot simples e adicionaremos essas dependências ao nossopom.xml:


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


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


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

As dependênciasspring-boot-starter-security,spring-boot-starter-webfluxespring-security-oauth2-client estão disponíveis no Maven Central.

3. Controlador principal

A seguir, adicionaremos um controlador simples para exibir o nome de usuário na página inicial:

@RestController
public class MainController {

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

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

4. Login usando o Google

Agora, vamos configurar nosso aplicativo para suportar login usando o Google.

Primeiro, precisamos criar um novo projeto emGoogle Developer Console

Agora, precisamos adicionar credenciais do OAuth2 (Criar credenciais> ID do cliente do OAuth).

A seguir, vamos adicionar isso a “URIs de redirecionamento autorizados”:

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

Então,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

Como temosspring-security-oauth2-client em nosso caminho, nosso aplicativo estará seguro.

Os usuários serão redirecionados para fazer login usando o Google antes de poderem acessar nossa página inicial.

5. Login usando provedor de autenticação

Também podemos configurar nosso aplicativo para fazer login a partir de um servidor de autorização personalizado.

No exemplo a seguir, usaremos nosso servidor de autorização deprevious article.

Desta vez, precisamos configurar mais propriedades, não apenas o ClientID e o 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

Nesse caso, também precisamos especificarscope,grant typeeredirect URI para o cliente OAuth2. Também forneceremosauthorization etoken URI do servidor de autorização.

Finalmente, precisamos configurar o endpointUserInfo também para poder obter os detalhes de autenticação do usuário.

6. Configuração de segurança

Por padrão, o Spring Security protege todos os caminhos. Portanto, se tivermos apenas um cliente OAuth, seremos redirecionados para autorizar esse cliente e fazer login.

Se vários clientes OAuth forem registrados, uma página de login será criada automaticamente para escolher o método de login.

Podemos mudar isso se quisermos eprovide 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();
    }
}

Neste exemplo, protegemos todos os caminhos, exceto “/ about”.

7. WebClient

Também podemos fazer mais do que apenas autenticar usuários usando o OAuth2. We can use WebClient to access OAuth2 secured resources using OAuth2AuthorizedClient.

Agora, vamos configurar nossoWebClient:

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

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

Em seguida, podemos recuperar um recurso protegido 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);
}

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

8. Conclusão

Neste artigo rápido, aprendemos como configurar nosso aplicativo WebFlux para usar o suporte ao Login OAuth2 e como usar o WebClient para acessar os recursos protegidos pelo OAuth2.

Como sempre, o código-fonte completo está disponívelover on GitHub.