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.