Login com Oauth2 usando o spring security
OAuth2 é um padrão de autenticação amplamente utilizado, que permite que sua aplicação se autentique mas não manipule diretamente nomes de usuários e senhas. Empresas como Google, Facebook e Twitter já utilizam esse padrão para prover o acesso à seus recursos de forma segura à aplicações de terceiros. Nesse caso você terceiriza a segurança dos dados do usuário a sistemas que já os possuem e gerenciam.
Obtendo as suas credenciais
Para obter as credenciais do cliente para autenticação Google OAuth2, vá para o Console de API do Google — seção “Credenciais”.
Aqui, criaremos credenciais do tipo “OAuth2 Client ID” para nosso aplicativo. Isso faz com que o Google configure um ID de cliente e segredo para nós.
Também temos que configurar um URI de redirecionamento autorizado no Google Console, que é o caminho para o qual os usuários serão redirecionados depois de fazerem login com o Google.
Para obter as credenciais do cliente para autenticação com o Facebook, precisamos registrar um aplicativo no site Facebook for Developers e configurar o URI correspondente como um “URI de redirecionamento OAuth válido”.
Dependências do Maven
Além das dependências Spring e Spring Security padrão, também precisaremos adicionar as dependências spring-security-oauth2-client e spring-security-oauth2-jose:
A primeira dependência é o client para o oauth 2 e a segunda é o José, conhecido porteiro e segurança do escritório de Rod Johnson, criador do spring, isso ou vem de (Javascript Object Signing and Encryption) que provem métodos para transferir seguramente.
- JSON Web Token (JWT)
- JSON Web Signature (JWS)
- JSON Web Encryption (JWE)
- JSON Web Key (JWK)
Configurações do nosso application.properties
Aqui colocamos o id e o secret que obtemos anteriormente, segue um exemplo mas pode não funcionar no momento do teste, o ideal é que já crie e teste suas credenciais.
Vamos ao código
A configuração automática do web security é equivalente a definir um elemento oauth2Login () simples:
Aqui, podemos ver que o elemento oauth2Login () é usado de maneira semelhante aos elementos httpBasic () e formLogin () já conhecidos.
- Ele cria um WebSecurityConfigurerAdapter, que protege todos os restful endpoints.
- Ele registra um ClientRegistrationRepository, usando seu serviço / repositório na memória. Isso significa que o aplicativo armazenará todos os dados do usuário na memória, uma vez conectado.
- Ele fornece o Client Registration. Usando a chave de API e o segredo de API de nossa conta do Google Cloud ou facebook developer, podemos atualizar as variáveis . Essa DSL também configura escopos, que solicitaremos do Google, mas o usuário deve aprovar os escopos para nos dar acesso às informações de seu perfil.
Aqui, configuramos nosso URL de login como / oauth_login.
A seguir, vamos definir um LoginController com um método que mapeia para essa URL:
No controller nos utilizamos o OAuth2AuthorizedClientService para carregar os clients de autorização e então finalmente o redirecionamos para nossa página oauth_login.html, vamos criar ela agora utilizando thymeleaf.
Aqui para cada client registrado nos criamos uma linha com o valor e a chave do client, no caso temos o google e o facebook como clients, a tela deverá ficar mais ou menos como essa, estou usando bootstrap pra dar alguma estilizada de leve.
Você é redirecionado para a pagina de autorização do client, como ocorre em outras páginas, e se tudo correr bem, irá conseguir acessar a página de sucesso de nosso controller.
Podemos pegar os atributos através do restTemplate e enviar para a nossa tela de sucesso, que ficará mais ou menos assim.
Hoje, este artigo mostrou como colocar em funcionamento o Spring Security 5 OAuth2 rapidamente. O aplicativo se integra ao Google para permitir autenticação segura e consentimento de usuários com uma conta Google. A API de aplicativos foi protegida usando um token de sessão que é gerado usando as bibliotecas Spring Security 5.4 OAuth2.
Espero que tenha sido útil para alguém e aqui segue o código completo deste exemplo https://github.com/Odilio/oauth2-spring