OAuth
O padrão oAuth foi criado para se preservar dados sensíveis de autenticação (usuário e senha) e dados atrelados ao usuário sob os quais estas credenciais teriam direito de acesso. Em outras palavras, o usuário deve ter o direito de se autenticar em sites e aplicativos de forma segura e integrada, mas controlando detalhadamente as permissões que ele deseja que o site possua em relação aos seus dados. Ficou confuso ou muito vago? Então vamos dar um exemplo mais realístico.
O Client pede autorização ao Resource Owner para acessar seus recursos;
Assumindo que o Resource Owner autorize o acesso, o Client recebe um authorization grant (garantia de autorização). Essa credencial representa a autorização concedida pelo Resource Owner;
O Client pede um access token ao Authorization Server, enviando o authorization grant;
Assumindo que o Client foi autorizado com sucesso e que o authorization grant é válido, o Authorization Server gera um access token e o envia ao Client;
O Client pede acesso a um recurso protegido pelo Resource Server, e se autentica utilizando o access token;
Assumindo que o access token seja válido, o Resource Server responde à requisição do Client servindo o recurso solicitado.
Trabalhando na aplicação!
Inclua as dependências abaixo no arquivo pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
Crie o pacote .config, e uma classe para gerenciar segurança (Security)
Na classe Security, implemente os métodos e anotações, conforme apresentado abaixo:
@EnableWebSecurity
@EnableAuthorizationServer
@EnableResourceServer
public class Security extends WebSecurityConfigurerAdapter {
@Bean
@Override
protected AuthenticationManager authenticationManager() throws Exception {
return super.authenticationManager();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("lucas").password("123").roles("ADMIN");
}
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
}
Configure os parâmetros de scope, client-id e client-secret da sua aplicação adicionando no arquivo application.properties em src/main/resources, conforme apresentado abaixo:
security.oauth2.client.scope=password
security.oauth2.client.client-id=cotemig
security.oauth2.client.client-secret=aulasecurity567
Inicie seu servidor e veja o resultado! Verifique que sua aplicação retornará uma mensagem, conforme abaixo:
<oauth>
<error_description>
Full authentication is required to access this resource
</error_description>
<error>unauthorized</error>
</oauth>
Sabemos então que a segurança foi aplicada!!!
No entanto, gostaríamos de utilizar nossos recursos e rotas, a fim de obtermos nossos resultados de forma segura.
Então, precisamos fazer nossas requisições usando um Token! Como vamos proceder desta forma? Vamos utilizar o Postman!
Abra o Postman, crie uma nova requisição do tipo POST para o caminho: http://localhost:8080/oauth/token e na aba Authorization, no campo TYPE selecione o valor Basic Auth. Insira os dados de autorização da aplicação!
Selecione a aba Body, na opção form-data, com os dados do seu usuário e pressione SEND conforme abaixo:
Um token deverá ser fornecido, conforme apresentado acima!
Com este token, usaremos para requisitar nossa aplicação!!!
Crie uma nova requisição GET no Postman, apontando para o seu recurso (ex.: http://localhost:8080/faculdade/rest/getAll). Na aba Authorization, no campo TYPE, informe o valor Bearer Token e insira o token fornecido. Clique no botão SEND, e confira o resultado conforme abaixo:
Pronto! Sua aplicação agora permite requisições seguras!!!
Obs.: Caso opte por ignorar alguma rota, altere a classe Security com o método abaixo:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/**");
web.ignoring().antMatchers("/faculdade/rest/getAll");
}