From e2b1d067fe68c5c213779f5881a57cfb99d7908f Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Wed, 9 Jun 2021 20:59:57 +1200 Subject: [PATCH 01/80] =?UTF-8?q?Chore:=20.gitignore=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 - be/.gitignore | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 2 deletions(-) delete mode 100644 README.md create mode 100644 be/.gitignore diff --git a/README.md b/README.md deleted file mode 100644 index 236b3b1cf..000000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# issue-tracker -그룹프로젝트 #5 diff --git a/be/.gitignore b/be/.gitignore new file mode 100644 index 000000000..5aa921117 --- /dev/null +++ b/be/.gitignore @@ -0,0 +1,184 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/intellij,java,macos,gradle +# Edit at https://www.toptal.com/developers/gitignore?templates=intellij,java,macos,gradle + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Gradle ### +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties + +### Gradle Patch ### +**/build/ + +# 주요 설정 정보 +/src/resources/application.properties + +# End of https://www.toptal.com/developers/gitignore/api/intellij,java,macos,gradle From 09b57c22d1b5e64faa695e9c7751281edd498c10 Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Wed, 9 Jun 2021 21:00:10 +1200 Subject: [PATCH 02/80] =?UTF-8?q?[#11]=20Feat:=20=EA=B9=83=ED=97=99=20Oaut?= =?UTF-8?q?h=EB=A1=9C=20AccessToken=20=EB=B0=9B=EC=95=84=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oauth/GithubAccessTokenRequestDto.java | 41 ++++++++++++++++ .../oauth/GithubAccessTokenResponseDto.java | 48 +++++++++++++++++++ .../java/com/issuetracker/oauth/JwtDto.java | 13 +++++ .../issuetracker/oauth/LoginController.java | 36 ++++++++++++++ .../java/com/issuetracker/util/Oauth.java | 45 +++++++++++++++++ 5 files changed, 183 insertions(+) create mode 100644 be/src/main/java/com/issuetracker/oauth/GithubAccessTokenRequestDto.java create mode 100644 be/src/main/java/com/issuetracker/oauth/GithubAccessTokenResponseDto.java create mode 100644 be/src/main/java/com/issuetracker/oauth/JwtDto.java create mode 100644 be/src/main/java/com/issuetracker/oauth/LoginController.java create mode 100644 be/src/main/java/com/issuetracker/util/Oauth.java diff --git a/be/src/main/java/com/issuetracker/oauth/GithubAccessTokenRequestDto.java b/be/src/main/java/com/issuetracker/oauth/GithubAccessTokenRequestDto.java new file mode 100644 index 000000000..0c39d0216 --- /dev/null +++ b/be/src/main/java/com/issuetracker/oauth/GithubAccessTokenRequestDto.java @@ -0,0 +1,41 @@ +package com.issuetracker.oauth; + +public class GithubAccessTokenRequestDto { + private String clientId; + private String clientSecret; + private String code; + private String redirectUri; + + public GithubAccessTokenRequestDto(String clientId, String clientSecret, String code, String redirectUri) { + this.clientId = clientId; + this.clientSecret = clientSecret; + this.code = code; + this.redirectUri = redirectUri; + } + + public String getClientId() { + return clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public String getCode() { + return code; + } + + public String getRedirectUri() { + return redirectUri; + } + + @Override + public String toString() { + return "GithubAccessTokenRequestDto{" + + "clientId='" + clientId + '\'' + + ", clientSecret='" + clientSecret + '\'' + + ", code='" + code + '\'' + + ", redirectUri='" + redirectUri + '\'' + + '}'; + } +} diff --git a/be/src/main/java/com/issuetracker/oauth/GithubAccessTokenResponseDto.java b/be/src/main/java/com/issuetracker/oauth/GithubAccessTokenResponseDto.java new file mode 100644 index 000000000..94dccbc21 --- /dev/null +++ b/be/src/main/java/com/issuetracker/oauth/GithubAccessTokenResponseDto.java @@ -0,0 +1,48 @@ +package com.issuetracker.oauth; + +import com.fasterxml.jackson.annotation.JsonSetter; + +public class GithubAccessTokenResponseDto { + private String accessToken; + private String tokenType; + private String scope; + + public GithubAccessTokenResponseDto() { + } + + public String getAccessToken() { + return accessToken; + } + + @JsonSetter("access_token") + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getTokenType() { + return tokenType; + } + + @JsonSetter("token_type") + public void setTokenType(String tokenType) { + this.tokenType = tokenType; + } + + public String getScope() { + return scope; + } + + @JsonSetter("scope") + public void setScope(String scope) { + this.scope = scope; + } + + @Override + public String toString() { + return "GithubAccessTokenResponseDto{" + + "accessToken='" + accessToken + '\'' + + ", tokenType='" + tokenType + '\'' + + ", scope='" + scope + '\'' + + '}'; + } +} diff --git a/be/src/main/java/com/issuetracker/oauth/JwtDto.java b/be/src/main/java/com/issuetracker/oauth/JwtDto.java new file mode 100644 index 000000000..246cc44c9 --- /dev/null +++ b/be/src/main/java/com/issuetracker/oauth/JwtDto.java @@ -0,0 +1,13 @@ +package com.issuetracker.oauth; + +public class JwtDto { + private String jwt; + + public JwtDto(String jwt) { + this.jwt = jwt; + } + + public String getJwt() { + return jwt; + } +} diff --git a/be/src/main/java/com/issuetracker/oauth/LoginController.java b/be/src/main/java/com/issuetracker/oauth/LoginController.java new file mode 100644 index 000000000..7443fdd9a --- /dev/null +++ b/be/src/main/java/com/issuetracker/oauth/LoginController.java @@ -0,0 +1,36 @@ +package com.issuetracker.oauth; + +import com.issuetracker.util.Oauth; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@RestController +@RequestMapping("/api/login") +public class LoginController { + + private Oauth oauthUtil; + + public LoginController(Oauth oauthUtil) { + this.oauthUtil = oauthUtil; + } + + @GetMapping("/auth") + public void login(@RequestParam String client, @RequestParam String code) { + RestTemplate githubRequest = new RestTemplate(); + String accessTokenUri = oauthUtil.getUriForAccesToken(code); + + RequestEntity requestDto = RequestEntity + .post(accessTokenUri) + .header("Accept", "application/json") + .body(new GithubAccessTokenRequestDto( + oauthUtil.getClientId(), oauthUtil.getClientSecret(), code, oauthUtil.getRedirectUri() + )); + + ResponseEntity responseDto = githubRequest.exchange(requestDto, GithubAccessTokenResponseDto.class); + } +} diff --git a/be/src/main/java/com/issuetracker/util/Oauth.java b/be/src/main/java/com/issuetracker/util/Oauth.java new file mode 100644 index 000000000..e0b79d1c1 --- /dev/null +++ b/be/src/main/java/com/issuetracker/util/Oauth.java @@ -0,0 +1,45 @@ +package com.issuetracker.util; + +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +@Component +@PropertySource("classpath:/oauth.properties") +public class Oauth { + + private final Environment environment; + + public Oauth(Environment environment) { + this.environment = environment; + } + + private static final String USERINFO_URI = "github.access.user.url"; + private static final String LOGIN_URI = "github.authorize.url"; + private static final String REDIRECT_URI = "github.callback.url"; + private static final String TOKEN_URI = "github.access.token.url"; + public static final String CLIENT_ID = "github.client.id"; + public static final String CLIENT_SECRET = "github.secret"; + public static final String SCOPE = "github.scope"; + + private String access_token; + + public String getClientId() { + return environment.getProperty(CLIENT_ID); + } + + public String getClientSecret() { + return environment.getProperty(CLIENT_SECRET); + } + + public String getRedirectUri() { + return environment.getProperty(REDIRECT_URI); + } + + public String getUriForAccesToken(String code) { + return environment.getProperty(TOKEN_URI) + "?client_id=" + + getClientId() + "&client_secret=" + getClientSecret() + + "&code=" + code; + } +} + From f9a01cdbb8b55a9f2f4d315e221e9e64b9feb021 Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Thu, 10 Jun 2021 14:37:49 +1200 Subject: [PATCH 03/80] =?UTF-8?q?[#11]=20Add:=20=EA=B9=83=ED=97=99=20?= =?UTF-8?q?=EC=84=9C=EB=B2=84=EC=97=90=20AccessToken=20=EC=9D=84=20?= =?UTF-8?q?=EB=8B=B4=EC=9D=80=20=EC=9A=94=EC=B2=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/issuetracker/oauth/LoginController.java | 11 ++++++++++- be/src/main/java/com/issuetracker/util/Oauth.java | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/be/src/main/java/com/issuetracker/oauth/LoginController.java b/be/src/main/java/com/issuetracker/oauth/LoginController.java index 7443fdd9a..1ec7c66a1 100644 --- a/be/src/main/java/com/issuetracker/oauth/LoginController.java +++ b/be/src/main/java/com/issuetracker/oauth/LoginController.java @@ -1,6 +1,7 @@ package com.issuetracker.oauth; import com.issuetracker.util.Oauth; +import org.springframework.http.HttpEntity; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -31,6 +32,14 @@ public void login(@RequestParam String client, @RequestParam String code) { oauthUtil.getClientId(), oauthUtil.getClientSecret(), code, oauthUtil.getRedirectUri() )); - ResponseEntity responseDto = githubRequest.exchange(requestDto, GithubAccessTokenResponseDto.class); + ResponseEntity responseDto = githubRequest.exchange(requestDto, GithubAccessTokenResponseDto.class); + + RequestEntity request = RequestEntity + .get(oauthUtil.getUserinfoUri()) + .header("Accept", "application/json") + .header("Authorization", "token " + responseDto.getBody().getAccessToken()) + .build(); + } } + diff --git a/be/src/main/java/com/issuetracker/util/Oauth.java b/be/src/main/java/com/issuetracker/util/Oauth.java index e0b79d1c1..f50e26ba2 100644 --- a/be/src/main/java/com/issuetracker/util/Oauth.java +++ b/be/src/main/java/com/issuetracker/util/Oauth.java @@ -36,6 +36,10 @@ public String getRedirectUri() { return environment.getProperty(REDIRECT_URI); } + public String getUserinfoUri() { + return environment.getProperty(USERINFO_URI); + } + public String getUriForAccesToken(String code) { return environment.getProperty(TOKEN_URI) + "?client_id=" + getClientId() + "&client_secret=" + getClientSecret() From d16d1dd7dc9f74a20c46117c59ed019161b02ddc Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Thu, 10 Jun 2021 14:48:24 +1200 Subject: [PATCH 04/80] =?UTF-8?q?[#11]=20Add:=20=EA=B9=83=ED=97=99?= =?UTF-8?q?=EC=97=90=20AccessToken=EC=9D=84=20=EA=B0=80=EC=A7=80=EA=B3=A0?= =?UTF-8?q?=20=EC=9A=94=EC=B2=AD=ED=95=98=EA=B3=A0=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=BB=A4=EC=8A=A4=ED=85=80=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A1=9C=20=EC=9C=A0=EC=A0=80=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=9B=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../issuetracker/oauth/LoginController.java | 3 ++ .../java/com/issuetracker/oauth/User.java | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 be/src/main/java/com/issuetracker/oauth/User.java diff --git a/be/src/main/java/com/issuetracker/oauth/LoginController.java b/be/src/main/java/com/issuetracker/oauth/LoginController.java index 1ec7c66a1..1cbfa5148 100644 --- a/be/src/main/java/com/issuetracker/oauth/LoginController.java +++ b/be/src/main/java/com/issuetracker/oauth/LoginController.java @@ -40,6 +40,9 @@ public void login(@RequestParam String client, @RequestParam String code) { .header("Authorization", "token " + responseDto.getBody().getAccessToken()) .build(); + ResponseEntity user = githubRequest.exchange(request, User.class);; + + } } diff --git a/be/src/main/java/com/issuetracker/oauth/User.java b/be/src/main/java/com/issuetracker/oauth/User.java new file mode 100644 index 000000000..7273f64ea --- /dev/null +++ b/be/src/main/java/com/issuetracker/oauth/User.java @@ -0,0 +1,28 @@ +package com.issuetracker.oauth; + +public class User { + private String login; + private Long id; + private String avatar_url; + + public String getLogin() { + return login; + } + + public Long getId() { + return id; + } + + public String getAvatar_url() { + return avatar_url; + } + + @Override + public String toString() { + return "User{" + + "login='" + login + '\'' + + ", id=" + id + + ", avatar_url='" + avatar_url + '\'' + + '}'; + } +} From 730ad1ea4361e2c4480192828dfcba92bba33d92 Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Thu, 10 Jun 2021 15:03:54 +1200 Subject: [PATCH 05/80] =?UTF-8?q?[#11]=20Feat:=20Oauth=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20JWT=20=EB=B0=9C=EA=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/issuetracker/oauth/LoginController.java | 17 +++++++++++++++-- .../main/java/com/issuetracker/util/Oauth.java | 11 +++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/be/src/main/java/com/issuetracker/oauth/LoginController.java b/be/src/main/java/com/issuetracker/oauth/LoginController.java index 1cbfa5148..7fc0bd05f 100644 --- a/be/src/main/java/com/issuetracker/oauth/LoginController.java +++ b/be/src/main/java/com/issuetracker/oauth/LoginController.java @@ -1,5 +1,7 @@ package com.issuetracker.oauth; +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; import com.issuetracker.util.Oauth; import org.springframework.http.HttpEntity; import org.springframework.http.RequestEntity; @@ -10,6 +12,8 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; +import java.time.LocalDateTime; + @RestController @RequestMapping("/api/login") public class LoginController { @@ -21,7 +25,7 @@ public LoginController(Oauth oauthUtil) { } @GetMapping("/auth") - public void login(@RequestParam String client, @RequestParam String code) { + public JwtDto login(@RequestParam String client, @RequestParam String code) { RestTemplate githubRequest = new RestTemplate(); String accessTokenUri = oauthUtil.getUriForAccesToken(code); @@ -40,9 +44,18 @@ public void login(@RequestParam String client, @RequestParam String code) { .header("Authorization", "token " + responseDto.getBody().getAccessToken()) .build(); - ResponseEntity user = githubRequest.exchange(request, User.class);; + ResponseEntity user = githubRequest.exchange(request, User.class); + + Algorithm algorithm = Algorithm.HMAC256(oauthUtil.getAlgorithmSecret()); + String jwt = JWT.create() + .withClaim("id", user.getBody().getId()) + .withClaim("name", user.getBody().getLogin()) + .withClaim("avatar_url", user.getBody().getAvatar_url()) + .withIssuer(oauthUtil.getIssuer()) + .sign(algorithm); + return new JwtDto(jwt); } } diff --git a/be/src/main/java/com/issuetracker/util/Oauth.java b/be/src/main/java/com/issuetracker/util/Oauth.java index f50e26ba2..d13d96eb1 100644 --- a/be/src/main/java/com/issuetracker/util/Oauth.java +++ b/be/src/main/java/com/issuetracker/util/Oauth.java @@ -22,6 +22,9 @@ public Oauth(Environment environment) { public static final String CLIENT_SECRET = "github.secret"; public static final String SCOPE = "github.scope"; + public static final String ALGORITHM_SECRET = "jwt.algorithm.secret"; + public static final String ISSUER = "jwt.issuer"; + private String access_token; public String getClientId() { @@ -40,6 +43,14 @@ public String getUserinfoUri() { return environment.getProperty(USERINFO_URI); } + public String getAlgorithmSecret() { + return environment.getProperty(ALGORITHM_SECRET); + } + + public String getIssuer() { + return environment.getProperty(ISSUER); + } + public String getUriForAccesToken(String code) { return environment.getProperty(TOKEN_URI) + "?client_id=" + getClientId() + "&client_secret=" + getClientSecret() From facf31088f419315caf086cdadec1e77c047548e Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Thu, 10 Jun 2021 15:35:13 +1200 Subject: [PATCH 06/80] =?UTF-8?q?[#14]=20Feat:=20=EB=AA=A8=EB=93=A0=20api?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20Interceptor=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/InterceptorConfig.java | 19 +++++++++++++++++++ .../issuetracker/oauth/LoginController.java | 5 +++++ .../issuetracker/oauth/OauthInterceptor.java | 17 +++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 be/src/main/java/com/issuetracker/config/InterceptorConfig.java create mode 100644 be/src/main/java/com/issuetracker/oauth/OauthInterceptor.java diff --git a/be/src/main/java/com/issuetracker/config/InterceptorConfig.java b/be/src/main/java/com/issuetracker/config/InterceptorConfig.java new file mode 100644 index 000000000..853f4a6a9 --- /dev/null +++ b/be/src/main/java/com/issuetracker/config/InterceptorConfig.java @@ -0,0 +1,19 @@ +package com.issuetracker.config; + +import com.issuetracker.oauth.OauthInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + + registry.addInterceptor(new OauthInterceptor()) + .addPathPatterns("/api/**"); +// .excludePathPatterns("/api/login/**") +// .excludePathPatterns("/api/accommodations/**"); + } +} diff --git a/be/src/main/java/com/issuetracker/oauth/LoginController.java b/be/src/main/java/com/issuetracker/oauth/LoginController.java index 7fc0bd05f..06eb03824 100644 --- a/be/src/main/java/com/issuetracker/oauth/LoginController.java +++ b/be/src/main/java/com/issuetracker/oauth/LoginController.java @@ -57,5 +57,10 @@ public JwtDto login(@RequestParam String client, @RequestParam String code) { return new JwtDto(jwt); } + + @GetMapping("/hello") + public void hell() { + System.out.println("something"); + } } diff --git a/be/src/main/java/com/issuetracker/oauth/OauthInterceptor.java b/be/src/main/java/com/issuetracker/oauth/OauthInterceptor.java new file mode 100644 index 000000000..ef742e7e1 --- /dev/null +++ b/be/src/main/java/com/issuetracker/oauth/OauthInterceptor.java @@ -0,0 +1,17 @@ +package com.issuetracker.oauth; + +import com.issuetracker.oauth.JwtDto; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +public class OauthInterceptor implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + String jwt = request.getHeader("Authorization"); + System.out.println(jwt); + return true; + } +} From 4f7c1b3e5ce0940d11d3b2b7b38da7040c6f105d Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Thu, 10 Jun 2021 18:19:22 +1200 Subject: [PATCH 07/80] =?UTF-8?q?[#14]=20Feat:=20Interceptor=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=EC=84=9C=20JWT=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=ED=9B=84=20=ED=8A=B9=EC=A0=95=20API=EB=A1=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EA=B0=80=EC=A0=B8=EC=98=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/InterceptorConfig.java | 8 +++++- .../issuetracker/oauth/LoginController.java | 12 +++------ .../issuetracker/oauth/OauthInterceptor.java | 25 ++++++++++++++++--- .../java/com/issuetracker/oauth/User.java | 6 +++++ 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/be/src/main/java/com/issuetracker/config/InterceptorConfig.java b/be/src/main/java/com/issuetracker/config/InterceptorConfig.java index 853f4a6a9..9c4da2c48 100644 --- a/be/src/main/java/com/issuetracker/config/InterceptorConfig.java +++ b/be/src/main/java/com/issuetracker/config/InterceptorConfig.java @@ -1,17 +1,23 @@ package com.issuetracker.config; import com.issuetracker.oauth.OauthInterceptor; +import com.issuetracker.util.Oauth; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class InterceptorConfig implements WebMvcConfigurer { + private final Oauth oauthUtil; + + public InterceptorConfig(Oauth oauthUtil) { + this.oauthUtil = oauthUtil; + } @Override public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(new OauthInterceptor()) + registry.addInterceptor(new OauthInterceptor(oauthUtil)) .addPathPatterns("/api/**"); // .excludePathPatterns("/api/login/**") // .excludePathPatterns("/api/accommodations/**"); diff --git a/be/src/main/java/com/issuetracker/oauth/LoginController.java b/be/src/main/java/com/issuetracker/oauth/LoginController.java index 06eb03824..6acebc52a 100644 --- a/be/src/main/java/com/issuetracker/oauth/LoginController.java +++ b/be/src/main/java/com/issuetracker/oauth/LoginController.java @@ -3,17 +3,11 @@ import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.issuetracker.util.Oauth; -import org.springframework.http.HttpEntity; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; -import java.time.LocalDateTime; - @RestController @RequestMapping("/api/login") public class LoginController { @@ -59,8 +53,8 @@ public JwtDto login(@RequestParam String client, @RequestParam String code) { } @GetMapping("/hello") - public void hell() { - System.out.println("something"); + public void hell(@RequestAttribute User user) { + System.out.println(user); } } diff --git a/be/src/main/java/com/issuetracker/oauth/OauthInterceptor.java b/be/src/main/java/com/issuetracker/oauth/OauthInterceptor.java index ef742e7e1..66dd82bbc 100644 --- a/be/src/main/java/com/issuetracker/oauth/OauthInterceptor.java +++ b/be/src/main/java/com/issuetracker/oauth/OauthInterceptor.java @@ -1,6 +1,10 @@ package com.issuetracker.oauth; -import com.issuetracker.oauth.JwtDto; +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.issuetracker.util.Oauth; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; @@ -8,10 +12,25 @@ public class OauthInterceptor implements HandlerInterceptor { + + private final JWTVerifier verifier; + + public OauthInterceptor(Oauth oauthUtil) { + Algorithm algorithm = Algorithm.HMAC256(oauthUtil.getAlgorithmSecret()); + verifier = JWT.require(algorithm) + .withIssuer(oauthUtil.getIssuer()) + .build(); + } + @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - String jwt = request.getHeader("Authorization"); - System.out.println(jwt); + String jwt = request.getHeader("Authorization").substring(7); + DecodedJWT decodedJWT = verifier.verify(jwt); + String name = decodedJWT.getClaim("name").asString(); + Long id = decodedJWT.getClaim("id").asLong(); + String avatar_url = decodedJWT.getClaim("avatar_url").asString(); + User user = new User(name, id, avatar_url); + request.setAttribute("user", user); return true; } } diff --git a/be/src/main/java/com/issuetracker/oauth/User.java b/be/src/main/java/com/issuetracker/oauth/User.java index 7273f64ea..8f1948f2e 100644 --- a/be/src/main/java/com/issuetracker/oauth/User.java +++ b/be/src/main/java/com/issuetracker/oauth/User.java @@ -5,6 +5,12 @@ public class User { private Long id; private String avatar_url; + public User(String login, Long id, String avatar_url) { + this.login = login; + this.id = id; + this.avatar_url = avatar_url; + } + public String getLogin() { return login; } From c0f4dd756422e903082e85ff8c3365dba89db0a7 Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Fri, 11 Jun 2021 14:07:25 +1200 Subject: [PATCH 08/80] =?UTF-8?q?Chore:=20build.gradle=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- be/build.gradle | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 be/build.gradle diff --git a/be/build.gradle b/be/build.gradle new file mode 100644 index 000000000..b7ff70e08 --- /dev/null +++ b/be/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'org.springframework.boot' version '2.5.0' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'java' +} + +group = 'com' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '1.8' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-web' + runtimeOnly 'mysql:mysql-connector-java' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'com.auth0:java-jwt:3.15.0' +} + +test { + useJUnitPlatform() +} From 18bfbd7b89d93316a92f306f7d38b246b3c6e847 Mon Sep 17 00:00:00 2001 From: kyu-kim-kr <59721293+kyu-kim-kr@users.noreply.github.com> Date: Fri, 11 Jun 2021 19:37:14 +1200 Subject: [PATCH 09/80] =?UTF-8?q?[#27]=20Feat:=20=EC=9D=B4=EC=8A=88=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20&=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IssueController.java | 24 ++++ .../com/issuetracker/controller/IssueDto.java | 15 +++ .../java/com/issuetracker/domain/Issue.java | 112 ++++++++++++++++++ .../java/com/issuetracker/domain/Label.java | 6 + .../issuetracker/repository/IssueMapper.java | 29 +++++ .../repository/IssueRepository.java | 40 +++++++ .../issuetracker/service/IssueService.java | 23 ++++ .../repository/IssueRepositoryTests.java | 70 +++++++++++ 8 files changed, 319 insertions(+) create mode 100644 be/src/main/java/com/issuetracker/controller/IssueController.java create mode 100644 be/src/main/java/com/issuetracker/controller/IssueDto.java create mode 100644 be/src/main/java/com/issuetracker/domain/Issue.java create mode 100644 be/src/main/java/com/issuetracker/domain/Label.java create mode 100644 be/src/main/java/com/issuetracker/repository/IssueMapper.java create mode 100644 be/src/main/java/com/issuetracker/repository/IssueRepository.java create mode 100644 be/src/main/java/com/issuetracker/service/IssueService.java create mode 100644 be/src/test/java/com/issuetracker/repository/IssueRepositoryTests.java diff --git a/be/src/main/java/com/issuetracker/controller/IssueController.java b/be/src/main/java/com/issuetracker/controller/IssueController.java new file mode 100644 index 000000000..cb21837c0 --- /dev/null +++ b/be/src/main/java/com/issuetracker/controller/IssueController.java @@ -0,0 +1,24 @@ +package com.issuetracker.controller; + +import com.issuetracker.service.IssueService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api") +public class IssueController { + + private final IssueService issueService; + + public IssueController(IssueService issueService) { + this.issueService = issueService; + } + + @GetMapping("/issues") + public List viewAllIssues() { + return issueService.getAllIssues(); + } +} diff --git a/be/src/main/java/com/issuetracker/controller/IssueDto.java b/be/src/main/java/com/issuetracker/controller/IssueDto.java new file mode 100644 index 000000000..8bc082216 --- /dev/null +++ b/be/src/main/java/com/issuetracker/controller/IssueDto.java @@ -0,0 +1,15 @@ +package com.issuetracker.controller; + +import java.time.LocalDateTime; +import java.util.List; + +import com.issuetracker.domain.Label; + +public class IssueDto { + private String title; + private String authorAvatarUrl; + private List