diff --git a/build.gradle b/build.gradle index 7b441d4..bddea14 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,9 @@ dependencies { compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-freemarker') compile('org.springframework.boot:spring-boot-starter-security') + compile('org.springframework.security.oauth:spring-security-oauth2') compile('org.springframework.boot:spring-boot-starter-web') + compile('org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5') runtime('org.springframework.boot:spring-boot-devtools') runtime('com.h2database:h2') runtime('mysql:mysql-connector-java') diff --git a/src/main/java/com/coduckfoilo/WebApplication.java b/src/main/java/com/coduckfoilo/WebApplication.java index 29ac5bc..665ea20 100644 --- a/src/main/java/com/coduckfoilo/WebApplication.java +++ b/src/main/java/com/coduckfoilo/WebApplication.java @@ -1,12 +1,101 @@ package com.coduckfoilo; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties; +import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.oauth2.client.OAuth2ClientContext; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; +import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter; +import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter; +import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.filter.CompositeFilter; + +import javax.servlet.Filter; +import java.util.ArrayList; +import java.util.List; @SpringBootApplication -public class WebApplication { +@EnableOAuth2Client +@Controller +public class WebApplication extends WebSecurityConfigurerAdapter { + + @Autowired + OAuth2ClientContext oauth2ClientContext; public static void main(String[] args) { SpringApplication.run(WebApplication.class, args); } + + @RequestMapping("/") + public String index() { + return "index"; + } + + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .antMatcher("/**") + .authorizeRequests() + .antMatchers("/", "/login**", "/webjars/**") + .permitAll() + .anyRequest() + .authenticated() + .and().logout().logoutSuccessUrl("/").permitAll() + .and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) + .and().addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class); + } + + @Bean + public FilterRegistrationBean oauth2ClientFilterRegistration( + OAuth2ClientContextFilter filter) { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(filter); + registration.setOrder(-100); + return registration; + } + + private Filter ssoFilter() { + + CompositeFilter filter = new CompositeFilter(); + List filters = new ArrayList<>(); + + OAuth2ClientAuthenticationProcessingFilter githubFilter = new OAuth2ClientAuthenticationProcessingFilter("/login/github"); + OAuth2RestTemplate githubTemplate = new OAuth2RestTemplate(github(), oauth2ClientContext); + githubFilter.setRestTemplate(githubTemplate); + UserInfoTokenServices tokenServices = new UserInfoTokenServices(githubResource().getUserInfoUri(), github().getClientId()); + tokenServices.setRestTemplate(githubTemplate); + githubFilter.setTokenServices(tokenServices); + + filters.add(githubFilter); + + filter.setFilters(filters); + return filter; + } + + @Bean + @ConfigurationProperties("github.client") + public AuthorizationCodeResourceDetails github() { + return new AuthorizationCodeResourceDetails(); + } + + @Bean + @ConfigurationProperties("github.resource") + public ResourceServerProperties githubResource() { + return new ResourceServerProperties(); + } + + } diff --git a/src/main/java/com/coduckfoilo/domain/UserController.java b/src/main/java/com/coduckfoilo/domain/UserController.java new file mode 100644 index 0000000..322582d --- /dev/null +++ b/src/main/java/com/coduckfoilo/domain/UserController.java @@ -0,0 +1,70 @@ +package com.coduckfoilo.domain; + +import com.coduckfoilo.domain.project.Project; +import com.coduckfoilo.domain.user.User; +import com.coduckfoilo.domain.user.UserRepository; +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.eclipse.egit.github.core.Repository; +import org.eclipse.egit.github.core.client.GitHubClient; +import org.eclipse.egit.github.core.client.GitHubRequest; +import org.eclipse.egit.github.core.client.GitHubResponse; +import org.eclipse.egit.github.core.service.GitHubService; +import org.eclipse.egit.github.core.service.RepositoryService; +import org.eclipse.egit.github.core.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; +import sun.reflect.annotation.ExceptionProxy; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * IDE : IntelliJ IDEA + * Created by minho on 2018. 2. 10.. + */ + +@RestController +@RequestMapping(value = "/") +public class UserController { + + @Autowired + private UserRepository userRepository; + + @RequestMapping(value = "/{name}", method = RequestMethod.GET) + public String getUser(@PathVariable("name") String name) { + // Git Hub API를 사용하기 위한 작업, Util class 로 대체할 예정 + String token = ((OAuth2AuthenticationDetails)SecurityContextHolder.getContext().getAuthentication().getDetails()).getTokenValue(); + + try { + GitHubClient gitHubClient = new GitHubClient(); + gitHubClient.setOAuth2Token(token); + UserService userService = new UserService(gitHubClient); + + String email = userService.getUser(name).getEmail(); + int id = userService.getUser(name).getId(); + String gitHubName = userService.getUser(name).getName(); + + return email + " " + id + " " + gitHubName; + + } catch (Exception e) { + e.printStackTrace(); + } + + return ""; + } + +} diff --git a/src/main/java/com/coduckfoilo/domain/user/User.java b/src/main/java/com/coduckfoilo/domain/user/User.java index 178bf2a..3387511 100644 --- a/src/main/java/com/coduckfoilo/domain/user/User.java +++ b/src/main/java/com/coduckfoilo/domain/user/User.java @@ -24,4 +24,7 @@ public class User { @Column(unique = true) private String email; + + @Column(unique = true) + private String githubName; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e69de29..806ef6c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -0,0 +1,9 @@ +github: + client: + clientId: ${GITHUB_OAUTH_APP_ID} + clientSecret: ${GITHUB_OAUTH_APP_PW} + accessTokenUri: https://github.com/login/oauth/access_token + userAuthorizationUri: https://github.com/login/oauth/authorize + clientAuthenticationScheme: form + resource: + userInfoUri: https://api.github.com/user \ No newline at end of file diff --git a/src/main/resources/templates/index.ftl b/src/main/resources/templates/index.ftl new file mode 100644 index 0000000..91d4c8d --- /dev/null +++ b/src/main/resources/templates/index.ftl @@ -0,0 +1,12 @@ + + + + + GitHub Login + + +
+ With Github: click here +
+ +