From 9a9e03d900531b3e382101cb832e00d455086cc7 Mon Sep 17 00:00:00 2001 From: can019 Date: Wed, 27 Aug 2025 01:34:15 +0900 Subject: [PATCH 1/4] chore: init auth structure --- .../auth/controller/AuthController.java | 9 ++++++ .../controller/Oauth2CallbackController.java | 11 ++++++++ .../icebang/auth/dto/LoginRequest.java | 5 ++++ .../auth/dto/external/AuthRequest.java | 14 ++++++++++ .../auth/dto/external/AuthResponse.java | 3 ++ .../external/DefaultRegistrationRequest.java | 6 ++++ .../internal/OAuth2RegistrationInternal.java | 22 +++++++++++++++ .../icebang/auth/provider/AuthProvider.java | 27 ++++++++++++++++++ .../auth/provider/DefaultAuthProvider.java | 18 ++++++++++++ .../auth/provider/KakaoAuthProvider.java | 28 +++++++++++++++++++ .../auth/provider/OAuth2AuthProvider.java | 10 +++++++ .../icebang/auth/service/AuthService.java | 13 +++++++++ .../auth/service/state/AuthStateService.java | 9 ++++++ .../service/state/JwtTokenStateService.java | 15 ++++++++++ .../service/state/SessionStateService.java | 15 ++++++++++ .../icebang/domain/user/UserStatus.java | 9 ++++++ .../icebang/domain/user/model/Users.java | 3 ++ 17 files changed, 217 insertions(+) create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/AuthController.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/Oauth2CallbackController.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthRequest.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthResponse.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/DefaultRegistrationRequest.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProvider.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultAuthProvider.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/KakaoAuthProvider.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/OAuth2AuthProvider.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthService.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/AuthStateService.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/JwtTokenStateService.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/SessionStateService.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/UserStatus.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/model/Users.java diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/AuthController.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/AuthController.java new file mode 100644 index 00000000..b723e3c6 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/AuthController.java @@ -0,0 +1,9 @@ +package com.gltkorea.icebang.auth.controller; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class AuthController {} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/Oauth2CallbackController.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/Oauth2CallbackController.java new file mode 100644 index 00000000..168b76b7 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/Oauth2CallbackController.java @@ -0,0 +1,11 @@ +package com.gltkorea.icebang.auth.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/v0/oauth/callback") +@RequiredArgsConstructor +public class Oauth2CallbackController {} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java new file mode 100644 index 00000000..4395d499 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java @@ -0,0 +1,5 @@ +package com.gltkorea.icebang.auth.dto; + +public interface LoginRequest { + String getIdentifier(); +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthRequest.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthRequest.java new file mode 100644 index 00000000..9789a7a5 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthRequest.java @@ -0,0 +1,14 @@ +package com.gltkorea.icebang.auth.dto.external; + +import com.gltkorea.icebang.auth.dto.LoginRequest; + +/** 로그인 시 사용 */ +public class AuthRequest implements LoginRequest { + private String email; + private String password; + + @Override + public String getIdentifier() { + return email; + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthResponse.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthResponse.java new file mode 100644 index 00000000..67becca9 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthResponse.java @@ -0,0 +1,3 @@ +package com.gltkorea.icebang.auth.dto.external; + +public class AuthResponse {} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/DefaultRegistrationRequest.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/DefaultRegistrationRequest.java new file mode 100644 index 00000000..05ced71b --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/DefaultRegistrationRequest.java @@ -0,0 +1,6 @@ +package com.gltkorea.icebang.auth.dto.external; + +public class DefaultRegistrationRequest { + private String email; + private String password; +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java new file mode 100644 index 00000000..28ec421c --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java @@ -0,0 +1,22 @@ +package com.gltkorea.icebang.auth.dto.internal; + +import com.gltkorea.icebang.auth.dto.LoginRequest; +import lombok.Getter; + +@Getter +public abstract class OAuth2RegistrationInternal implements LoginRequest { + private final String provider; + private final String oauthId; + private final String email; + + protected OAuth2RegistrationInternal(String provider, String oauthId, String email) { + this.provider = provider; + this.oauthId = oauthId; + this.email = email; + } + + @Override + public String getIdentifier() { + return oauthId; // OAuth는 ID로 식별 + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProvider.java new file mode 100644 index 00000000..b841fb79 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProvider.java @@ -0,0 +1,27 @@ +package com.gltkorea.icebang.auth.provider; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +import com.gltkorea.icebang.auth.dto.external.AuthRequest; + +public interface AuthProvider { + + /** + * 인증 수행 + * + * @param request AuthRequest + * @return Authentication 객체 + */ + Authentication authenticate(AuthRequest request) throws AuthenticationException; + + /** + * 이 Provider가 요청을 처리할 수 있는지 여부 + * + *

AuthRequest Dto 필드에 따라 처리 유무 return + * + * @param request AuthRequest + * @return true: 처리 가능 + */ + boolean supports(AuthRequest request); +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultAuthProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultAuthProvider.java new file mode 100644 index 00000000..181ded11 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultAuthProvider.java @@ -0,0 +1,18 @@ +package com.gltkorea.icebang.auth.provider; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +import com.gltkorea.icebang.auth.dto.external.AuthRequest; + +public class DefaultAuthProvider implements AuthProvider { + @Override + public Authentication authenticate(AuthRequest request) throws AuthenticationException { + return null; + } + + @Override + public boolean supports(AuthRequest request) { + return false; + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/KakaoAuthProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/KakaoAuthProvider.java new file mode 100644 index 00000000..7cc43335 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/KakaoAuthProvider.java @@ -0,0 +1,28 @@ +package com.gltkorea.icebang.auth.provider; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +import com.gltkorea.icebang.auth.dto.external.AuthRequest; + +public class KakaoAuthProvider implements OAuth2AuthProvider { + @Override + public Authentication authenticateWithCode(String code) throws AuthenticationException { + return null; + } + + @Override + public boolean supportsProvider(String oauthProvider) { + return false; + } + + @Override + public Authentication authenticate(AuthRequest request) throws AuthenticationException { + return null; + } + + @Override + public boolean supports(AuthRequest request) { + return false; + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/OAuth2AuthProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/OAuth2AuthProvider.java new file mode 100644 index 00000000..69342006 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/OAuth2AuthProvider.java @@ -0,0 +1,10 @@ +package com.gltkorea.icebang.auth.provider; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +public interface OAuth2AuthProvider extends AuthProvider { + Authentication authenticateWithCode(String code) throws AuthenticationException; + + boolean supportsProvider(String oauthProvider); +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthService.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthService.java new file mode 100644 index 00000000..db0c6d37 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthService.java @@ -0,0 +1,13 @@ +package com.gltkorea.icebang.auth.service; + +import com.gltkorea.icebang.auth.dto.LoginRequest; +import com.gltkorea.icebang.auth.dto.external.AuthResponse; +import com.gltkorea.icebang.domain.user.model.Users; + +public interface AuthService { + AuthResponse login(LoginRequest request); + + void logout(String token); + + Users loadUser(String identifier); +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/AuthStateService.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/AuthStateService.java new file mode 100644 index 00000000..c802b309 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/AuthStateService.java @@ -0,0 +1,9 @@ +package com.gltkorea.icebang.auth.service.state; + +import org.springframework.security.core.userdetails.UserDetails; + +public sealed interface AuthStateService permits SessionStateService, JwtTokenStateService { + String create(UserDetails userDetails); + + UserDetails validate(String identifier); +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/JwtTokenStateService.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/JwtTokenStateService.java new file mode 100644 index 00000000..9065820e --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/JwtTokenStateService.java @@ -0,0 +1,15 @@ +package com.gltkorea.icebang.auth.service.state; + +import org.springframework.security.core.userdetails.UserDetails; + +public final class JwtTokenStateService implements AuthStateService { + @Override + public String create(UserDetails userDetails) { + return ""; + } + + @Override + public UserDetails validate(String identifier) { + return null; + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/SessionStateService.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/SessionStateService.java new file mode 100644 index 00000000..9bed4d1a --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/state/SessionStateService.java @@ -0,0 +1,15 @@ +package com.gltkorea.icebang.auth.service.state; + +import org.springframework.security.core.userdetails.UserDetails; + +public final class SessionStateService implements AuthStateService { + @Override + public String create(UserDetails userDetails) { + return ""; + } + + @Override + public UserDetails validate(String identifier) { + return null; + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/UserStatus.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/UserStatus.java new file mode 100644 index 00000000..6fe01f98 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/UserStatus.java @@ -0,0 +1,9 @@ +package com.gltkorea.icebang.domain.user; + +enum UserStatus { + PENDING, // 기본 정보만 입력됨 + PROFILE_INCOMPLETE, // 프로필 사진 등 추가 정보 필요 + ACTIVE, // 완전히 활성화됨 + SUSPENDED, // 일시 정지 + DELETED // 삭제됨 +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/model/Users.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/model/Users.java new file mode 100644 index 00000000..d8fe4f0b --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/model/Users.java @@ -0,0 +1,3 @@ +package com.gltkorea.icebang.domain.user.model; + +public class Users {} From 574b89dd3eb81a1686b7ff5aea307d8380ebd28d Mon Sep 17 00:00:00 2001 From: can019 Date: Wed, 27 Aug 2025 01:34:41 +0900 Subject: [PATCH 2/4] chore: fix lint --- .../main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java | 2 +- .../icebang/auth/dto/internal/OAuth2RegistrationInternal.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java index 4395d499..973814a8 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java @@ -1,5 +1,5 @@ package com.gltkorea.icebang.auth.dto; public interface LoginRequest { - String getIdentifier(); + String getIdentifier(); } diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java index 28ec421c..1c7b736a 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java @@ -1,6 +1,7 @@ package com.gltkorea.icebang.auth.dto.internal; import com.gltkorea.icebang.auth.dto.LoginRequest; + import lombok.Getter; @Getter From 3e0bd24ab8a3fa772b801766267d3086e29b9748 Mon Sep 17 00:00:00 2001 From: can019 Date: Wed, 27 Aug 2025 14:23:42 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20Auth=20skeleton=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/AuthController.java | 43 +++++++++++++++++- .../controller/Oauth2CallbackController.java | 17 +++++-- .../icebang/auth/dto/AuthRequestWrapper.java | 3 ++ .../auth/dto/DefaultRequestWrapper.java | 13 ++++++ .../gltkorea/icebang/auth/dto/LoginDto.java | 3 ++ .../auth/dto/OAuth2RequestWrapper.java | 12 +++++ .../auth/dto/Oauth2CallbackContent.java | 7 +++ .../gltkorea/icebang/auth/dto/SignUpDto.java | 3 ++ .../auth/dto/external/AuthRequest.java | 14 ------ .../auth/dto/external/AuthResponse.java | 3 -- .../external/DefaultRegistrationRequest.java | 6 --- .../icebang/auth/provider/AuthProvider.java | 24 ++-------- .../auth/provider/AuthProviderFactory.java | 44 +++++++++++++++++++ .../auth/provider/DefaultAuthProvider.java | 18 -------- .../auth/provider/DefaultProvider.java | 19 ++++++++ .../auth/provider/KakaoAuthProvider.java | 28 ------------ .../auth/provider/OAuth2AuthProvider.java | 7 ++- .../icebang/auth/service/AuthService.java | 8 ++-- .../icebang/auth/service/AuthServiceImpl.java | 25 +++++++++++ .../icebang/domain/user/UserStatus.java | 5 +-- .../icebang/domain/user/model/Users.java | 6 ++- ....java => SecurityAuthenticateAdapter.java} | 9 +++- 22 files changed, 209 insertions(+), 108 deletions(-) create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/AuthRequestWrapper.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/DefaultRequestWrapper.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginDto.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/OAuth2RequestWrapper.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/Oauth2CallbackContent.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/SignUpDto.java delete mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthRequest.java delete mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthResponse.java delete mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/DefaultRegistrationRequest.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProviderFactory.java delete mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultAuthProvider.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultProvider.java delete mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/KakaoAuthProvider.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthServiceImpl.java rename apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/{UserAuthServiceImpl.java => SecurityAuthenticateAdapter.java} (52%) diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/AuthController.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/AuthController.java index b723e3c6..1e2f9dae 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/AuthController.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/AuthController.java @@ -1,9 +1,50 @@ package com.gltkorea.icebang.auth.controller; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.gltkorea.icebang.auth.dto.DefaultRequestWrapper; +import com.gltkorea.icebang.auth.dto.LoginDto; +import com.gltkorea.icebang.auth.dto.SignUpDto; +import com.gltkorea.icebang.auth.provider.AuthProvider; +import com.gltkorea.icebang.auth.provider.AuthProviderFactory; + import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor -public class AuthController {} +@RequestMapping("/v0/auth") +public class AuthController { + private final AuthProviderFactory authProviderFactory; + + @PostMapping("/signup") + public ResponseEntity signUp(@RequestBody SignUpDto signUpDto) { + // 1. Wrapper DTO 생성 + DefaultRequestWrapper wrapper = DefaultRequestWrapper.builder().signUpDto(signUpDto).build(); + + // 2. Factory에서 Provider 선택 + @SuppressWarnings("unchecked") + AuthProvider provider = + (AuthProvider) authProviderFactory.getProvider("default"); + + // 3. Provider에 인증 위임 (Provider 내부에서 signUp + login 처리) + Authentication auth = provider.authenticate(wrapper); + + // 4. 결과 반환 + return ResponseEntity.status(201).body(auth); + } + + @PostMapping("/signin") + public ResponseEntity signIn(@RequestBody LoginDto loginDto) { + DefaultRequestWrapper wrapper = DefaultRequestWrapper.builder().loginDto(loginDto).build(); + @SuppressWarnings("unchecked") + AuthProvider provider = + (AuthProvider) authProviderFactory.getProvider("default"); + Authentication auth = provider.authenticate(wrapper); + return ResponseEntity.ok(auth); + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/Oauth2CallbackController.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/Oauth2CallbackController.java index 168b76b7..f21d206a 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/Oauth2CallbackController.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/controller/Oauth2CallbackController.java @@ -1,11 +1,20 @@ package com.gltkorea.icebang.auth.controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; @RestController -@RequestMapping("/v0/oauth/callback") +@RequestMapping("/v0/oauth2/callback") @RequiredArgsConstructor -public class Oauth2CallbackController {} +public class Oauth2CallbackController { + + @GetMapping("/kakao") + public void handleKakaoCallback(@RequestParam String code) { + // OAuth2RequestWrapper wrapper = new OAuth2RequestWrapper(new + // Oauth2CallbackContent("kakao", code)); + // OAuth2AuthProvider provider = (OAuth2AuthProvider) + // authProviderFactory.getProvider(providerKey); + // Authentication auth = provider.authenticate(wrapper); + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/AuthRequestWrapper.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/AuthRequestWrapper.java new file mode 100644 index 00000000..3aac5ee4 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/AuthRequestWrapper.java @@ -0,0 +1,3 @@ +package com.gltkorea.icebang.auth.dto; + +public interface AuthRequestWrapper {} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/DefaultRequestWrapper.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/DefaultRequestWrapper.java new file mode 100644 index 00000000..4c2ebc93 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/DefaultRequestWrapper.java @@ -0,0 +1,13 @@ +package com.gltkorea.icebang.auth.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Builder +@AllArgsConstructor +@Getter +public class DefaultRequestWrapper implements AuthRequestWrapper { + private final LoginDto loginDto; + private final SignUpDto signUpDto; +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginDto.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginDto.java new file mode 100644 index 00000000..73fda179 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginDto.java @@ -0,0 +1,3 @@ +package com.gltkorea.icebang.auth.dto; + +public class LoginDto {} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/OAuth2RequestWrapper.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/OAuth2RequestWrapper.java new file mode 100644 index 00000000..482aaf7c --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/OAuth2RequestWrapper.java @@ -0,0 +1,12 @@ +package com.gltkorea.icebang.auth.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +@Builder +public class OAuth2RequestWrapper implements AuthRequestWrapper { + private Oauth2CallbackContent callbackContent; +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/Oauth2CallbackContent.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/Oauth2CallbackContent.java new file mode 100644 index 00000000..d496b534 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/Oauth2CallbackContent.java @@ -0,0 +1,7 @@ +package com.gltkorea.icebang.auth.dto; + +public class Oauth2CallbackContent { + private String code; + private String state; + private String provider; +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/SignUpDto.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/SignUpDto.java new file mode 100644 index 00000000..5dc869fa --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/SignUpDto.java @@ -0,0 +1,3 @@ +package com.gltkorea.icebang.auth.dto; + +public class SignUpDto {} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthRequest.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthRequest.java deleted file mode 100644 index 9789a7a5..00000000 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gltkorea.icebang.auth.dto.external; - -import com.gltkorea.icebang.auth.dto.LoginRequest; - -/** 로그인 시 사용 */ -public class AuthRequest implements LoginRequest { - private String email; - private String password; - - @Override - public String getIdentifier() { - return email; - } -} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthResponse.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthResponse.java deleted file mode 100644 index 67becca9..00000000 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/AuthResponse.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.gltkorea.icebang.auth.dto.external; - -public class AuthResponse {} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/DefaultRegistrationRequest.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/DefaultRegistrationRequest.java deleted file mode 100644 index 05ced71b..00000000 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/external/DefaultRegistrationRequest.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.gltkorea.icebang.auth.dto.external; - -public class DefaultRegistrationRequest { - private String email; - private String password; -} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProvider.java index b841fb79..8380e96e 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProvider.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProvider.java @@ -1,27 +1,11 @@ package com.gltkorea.icebang.auth.provider; import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import com.gltkorea.icebang.auth.dto.external.AuthRequest; +import com.gltkorea.icebang.auth.dto.AuthRequestWrapper; -public interface AuthProvider { +public interface AuthProvider { + boolean supports(T request); - /** - * 인증 수행 - * - * @param request AuthRequest - * @return Authentication 객체 - */ - Authentication authenticate(AuthRequest request) throws AuthenticationException; - - /** - * 이 Provider가 요청을 처리할 수 있는지 여부 - * - *

AuthRequest Dto 필드에 따라 처리 유무 return - * - * @param request AuthRequest - * @return true: 처리 가능 - */ - boolean supports(AuthRequest request); + Authentication authenticate(T request); } diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProviderFactory.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProviderFactory.java new file mode 100644 index 00000000..4f41363e --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/AuthProviderFactory.java @@ -0,0 +1,44 @@ +package com.gltkorea.icebang.auth.provider; + +import java.util.Map; + +import org.springframework.stereotype.Component; + +import com.gltkorea.icebang.auth.dto.AuthRequestWrapper; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class AuthProviderFactory { + + private final Map> providers; + + /** + * providerKey에 해당하는 AuthProvider 반환 + * + * @param providerKey "google", "naver", "default" 등, enum으로 refactoring 필요 + * @return AuthProvider + */ + public AuthProvider getProvider(String providerKey) { + AuthProvider provider = providers.get(providerKey.toLowerCase()); + if (provider == null) { + throw new IllegalArgumentException("Unknown auth provider: " + providerKey); + } + return provider; + } + + /** + * OAuth2 전용 Provider 반환 + * + * @param providerKey OAuth2 provider key + * @return OAuth2AuthProvider + */ + public OAuth2AuthProvider getOAuth2Provider(String providerKey) { + AuthProvider provider = getProvider(providerKey); + if (!(provider instanceof OAuth2AuthProvider oauthProvider)) { + throw new IllegalArgumentException(providerKey + " is not an OAuth2 provider"); + } + return oauthProvider; + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultAuthProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultAuthProvider.java deleted file mode 100644 index 181ded11..00000000 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultAuthProvider.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gltkorea.icebang.auth.provider; - -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; - -import com.gltkorea.icebang.auth.dto.external.AuthRequest; - -public class DefaultAuthProvider implements AuthProvider { - @Override - public Authentication authenticate(AuthRequest request) throws AuthenticationException { - return null; - } - - @Override - public boolean supports(AuthRequest request) { - return false; - } -} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultProvider.java new file mode 100644 index 00000000..40a44c7c --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/DefaultProvider.java @@ -0,0 +1,19 @@ +package com.gltkorea.icebang.auth.provider; + +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +import com.gltkorea.icebang.auth.dto.DefaultRequestWrapper; + +@Component("default") +public class DefaultProvider implements AuthProvider { + @Override + public boolean supports(DefaultRequestWrapper request) { + return false; + } + + @Override + public Authentication authenticate(DefaultRequestWrapper request) { + return null; + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/KakaoAuthProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/KakaoAuthProvider.java deleted file mode 100644 index 7cc43335..00000000 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/KakaoAuthProvider.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.gltkorea.icebang.auth.provider; - -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; - -import com.gltkorea.icebang.auth.dto.external.AuthRequest; - -public class KakaoAuthProvider implements OAuth2AuthProvider { - @Override - public Authentication authenticateWithCode(String code) throws AuthenticationException { - return null; - } - - @Override - public boolean supportsProvider(String oauthProvider) { - return false; - } - - @Override - public Authentication authenticate(AuthRequest request) throws AuthenticationException { - return null; - } - - @Override - public boolean supports(AuthRequest request) { - return false; - } -} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/OAuth2AuthProvider.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/OAuth2AuthProvider.java index 69342006..30be51f4 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/OAuth2AuthProvider.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/provider/OAuth2AuthProvider.java @@ -1,10 +1,9 @@ package com.gltkorea.icebang.auth.provider; import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -public interface OAuth2AuthProvider extends AuthProvider { - Authentication authenticateWithCode(String code) throws AuthenticationException; +import com.gltkorea.icebang.auth.dto.OAuth2RequestWrapper; - boolean supportsProvider(String oauthProvider); +public interface OAuth2AuthProvider extends AuthProvider { + Authentication authenticateWithCode(OAuth2RequestWrapper oauthContent); } diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthService.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthService.java index db0c6d37..30a2a131 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthService.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthService.java @@ -1,13 +1,13 @@ package com.gltkorea.icebang.auth.service; -import com.gltkorea.icebang.auth.dto.LoginRequest; -import com.gltkorea.icebang.auth.dto.external.AuthResponse; +import com.gltkorea.icebang.auth.dto.LoginDto; +import com.gltkorea.icebang.auth.dto.SignUpDto; import com.gltkorea.icebang.domain.user.model.Users; public interface AuthService { - AuthResponse login(LoginRequest request); + Users signUp(SignUpDto signUpDto); - void logout(String token); + Users login(LoginDto loginDto); Users loadUser(String identifier); } diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthServiceImpl.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthServiceImpl.java new file mode 100644 index 00000000..aa118d2d --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/service/AuthServiceImpl.java @@ -0,0 +1,25 @@ +package com.gltkorea.icebang.auth.service; + +import org.springframework.stereotype.Service; + +import com.gltkorea.icebang.auth.dto.LoginDto; +import com.gltkorea.icebang.auth.dto.SignUpDto; +import com.gltkorea.icebang.domain.user.model.Users; + +@Service +public class AuthServiceImpl implements AuthService { + @Override + public Users signUp(SignUpDto signUpDto) { + return null; + } + + @Override + public Users login(LoginDto loginDto) { + return null; + } + + @Override + public Users loadUser(String identifier) { + return null; + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/UserStatus.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/UserStatus.java index 6fe01f98..b23e47e8 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/UserStatus.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/UserStatus.java @@ -1,8 +1,7 @@ package com.gltkorea.icebang.domain.user; -enum UserStatus { - PENDING, // 기본 정보만 입력됨 - PROFILE_INCOMPLETE, // 프로필 사진 등 추가 정보 필요 +public enum UserStatus { + ONBOARDING, // email, password만 된 경우 ACTIVE, // 완전히 활성화됨 SUSPENDED, // 일시 정지 DELETED // 삭제됨 diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/model/Users.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/model/Users.java index d8fe4f0b..ab4d28d1 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/model/Users.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/model/Users.java @@ -1,3 +1,7 @@ package com.gltkorea.icebang.domain.user.model; -public class Users {} +import com.gltkorea.icebang.domain.user.UserStatus; + +public class Users { + private UserStatus status; +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/UserAuthServiceImpl.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/SecurityAuthenticateAdapter.java similarity index 52% rename from apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/UserAuthServiceImpl.java rename to apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/SecurityAuthenticateAdapter.java index 272e289e..f33f546f 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/UserAuthServiceImpl.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/SecurityAuthenticateAdapter.java @@ -3,11 +3,16 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; +import com.gltkorea.icebang.auth.service.AuthService; import com.gltkorea.icebang.domain.user.model.UserAccountPrincipal; +import com.gltkorea.icebang.domain.user.model.Users; + +public class SecurityAuthenticateAdapter implements UserAuthService { + private AuthService authService; -public class UserAuthServiceImpl implements UserAuthService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - return UserAccountPrincipal.builder().build(); + Users user = authService.loadUser(username); + return UserAccountPrincipal.builder().build(); // @TODO users -> userdetail로 } } From 9c0c31ce26c3bd5ec8c780717336b4e885882571 Mon Sep 17 00:00:00 2001 From: can019 Date: Wed, 27 Aug 2025 14:28:06 +0900 Subject: [PATCH 4/4] chore: fix conflict --- .../icebang/auth/dto/LoginRequest.java | 5 ---- .../auth/dto/OAuth2RequestWrapper.java | 4 ++-- .../internal/OAuth2RegistrationInternal.java | 23 ------------------- 3 files changed, 2 insertions(+), 30 deletions(-) delete mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java delete mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java deleted file mode 100644 index 973814a8..00000000 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/LoginRequest.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gltkorea.icebang.auth.dto; - -public interface LoginRequest { - String getIdentifier(); -} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/OAuth2RequestWrapper.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/OAuth2RequestWrapper.java index 482aaf7c..86e9b5d7 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/OAuth2RequestWrapper.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/OAuth2RequestWrapper.java @@ -1,12 +1,12 @@ package com.gltkorea.icebang.auth.dto; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.RequiredArgsConstructor; @Getter -@RequiredArgsConstructor @Builder +@AllArgsConstructor public class OAuth2RequestWrapper implements AuthRequestWrapper { private Oauth2CallbackContent callbackContent; } diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java b/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java deleted file mode 100644 index 1c7b736a..00000000 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/auth/dto/internal/OAuth2RegistrationInternal.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.gltkorea.icebang.auth.dto.internal; - -import com.gltkorea.icebang.auth.dto.LoginRequest; - -import lombok.Getter; - -@Getter -public abstract class OAuth2RegistrationInternal implements LoginRequest { - private final String provider; - private final String oauthId; - private final String email; - - protected OAuth2RegistrationInternal(String provider, String oauthId, String email) { - this.provider = provider; - this.oauthId = oauthId; - this.email = email; - } - - @Override - public String getIdentifier() { - return oauthId; // OAuth는 ID로 식별 - } -}