From 35021afb6f6bb2832c4d6692b9ae1060db3089ec Mon Sep 17 00:00:00 2001 From: tjdtn0219 Date: Sun, 21 Jan 2024 15:25:57 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EC=BF=A0=ED=82=A4=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=201=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oauth/Oauth2LoginSuccessHandler.java | 2 +- .../auth/controller/AuthController.java | 8 +++- .../domain/auth/service/AuthService.java | 46 ++++++++++++++++++- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/security/oauth/Oauth2LoginSuccessHandler.java b/src/main/java/kr/co/fastcampus/yanabada/common/security/oauth/Oauth2LoginSuccessHandler.java index 57a32057..013030e3 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/security/oauth/Oauth2LoginSuccessHandler.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/security/oauth/Oauth2LoginSuccessHandler.java @@ -55,7 +55,7 @@ public void onAuthenticationSuccess( /* 바로 로그인 */ LoginRequest loginRequest = new LoginRequest(email, oauthPassword); LoginResponse loginResponse - = authService.loginOauth(loginRequest, ProviderType.valueOf(provider)); + = authService.loginOauth(response, loginRequest, ProviderType.valueOf(provider)); String loginResponseJson = objectMapper.writeValueAsString(loginResponse); response.setStatus(OK.value()); diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/auth/controller/AuthController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/auth/controller/AuthController.java index 586352fc..b58e0263 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/auth/controller/AuthController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/auth/controller/AuthController.java @@ -2,6 +2,7 @@ import static kr.co.fastcampus.yanabada.common.jwt.constant.JwtConstant.AUTHORIZATION_HEADER; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import kr.co.fastcampus.yanabada.common.jwt.dto.TokenRefreshResponse; import kr.co.fastcampus.yanabada.common.jwt.util.JwtUtils; @@ -44,8 +45,11 @@ public ResponseBody oauthSignUp(@RequestBody @Valid OauthSignUpRequest sig } @PostMapping("/login") - public ResponseBody login(@RequestBody @Valid LoginRequest loginRequest) { - return ResponseBody.ok(authService.login(loginRequest)); + public ResponseBody login( + HttpServletResponse response, + @RequestBody @Valid LoginRequest loginRequest + ) { + return ResponseBody.ok(authService.login(response, loginRequest)); } @PostMapping("/logout") diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/auth/service/AuthService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/auth/service/AuthService.java index 9d4a4432..f0330ac3 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/auth/service/AuthService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/auth/service/AuthService.java @@ -3,8 +3,12 @@ import static kr.co.fastcampus.yanabada.domain.member.entity.ProviderType.EMAIL; import static kr.co.fastcampus.yanabada.domain.member.entity.RoleType.ROLE_USER; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletResponse; import java.util.Random; import kr.co.fastcampus.yanabada.common.exception.EmailDuplicatedException; +import kr.co.fastcampus.yanabada.common.exception.JsonProcessFailedException; import kr.co.fastcampus.yanabada.common.jwt.dto.TokenIssueResponse; import kr.co.fastcampus.yanabada.common.jwt.dto.TokenRefreshResponse; import kr.co.fastcampus.yanabada.common.jwt.service.TokenService; @@ -13,12 +17,14 @@ import kr.co.fastcampus.yanabada.domain.auth.dto.request.OauthSignUpRequest; import kr.co.fastcampus.yanabada.domain.auth.dto.request.SignUpRequest; import kr.co.fastcampus.yanabada.domain.auth.dto.response.LoginResponse; +import kr.co.fastcampus.yanabada.domain.member.dto.response.MemberDetailResponse; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.member.entity.ProviderType; import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseCookie; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.crypto.password.PasswordEncoder; @@ -37,6 +43,7 @@ public class AuthService { private final JwtProvider jwtProvider; private final AuthenticationManagerBuilder authenticationManagerBuilder; private final TokenService tokenService; + private final ObjectMapper objectMapper; @Value("${spring.login.oauth2-password}") String oauthPassword; @@ -87,7 +94,9 @@ private String getRandomProfileImage() { } @Transactional - public LoginResponse login(LoginRequest loginRequest) { + public LoginResponse login( + HttpServletResponse response, LoginRequest loginRequest + ) { UsernamePasswordAuthenticationToken authenticationToken = loginRequest.toAuthentication(); authenticationManagerBuilder.getObject().authenticate(authenticationToken); @@ -98,11 +107,18 @@ public LoginResponse login(LoginRequest loginRequest) { tokenIssue = jwtProvider .generateTokenInfo(loginRequest.email(), ROLE_USER.name(), EMAIL.name()); } + storeValueInCookie(response, "accessToken", tokenIssue.accessToken()); + storeValueInCookie(response, "refreshToken", tokenIssue.refreshToken()); + storeValueInCookie(response, "member", getMemberDtoJsonStr(member)); return LoginResponse.from(tokenIssue, member); } @Transactional - public LoginResponse loginOauth(LoginRequest loginRequest, ProviderType providerType) { + public LoginResponse loginOauth( + HttpServletResponse response, + LoginRequest loginRequest, + ProviderType providerType + ) { Member member = memberRepository.getMember(loginRequest.email(), providerType); TokenIssueResponse tokenIssue = tokenService.getTokenIssue(loginRequest.email(), providerType.name()); @@ -110,9 +126,35 @@ public LoginResponse loginOauth(LoginRequest loginRequest, ProviderType provider tokenIssue = jwtProvider .generateTokenInfo(loginRequest.email(), ROLE_USER.name(), providerType.name()); } + storeValueInCookie(response, "accessToken", tokenIssue.accessToken()); + storeValueInCookie(response, "refreshToken", tokenIssue.refreshToken()); + storeValueInCookie(response, "member", getMemberDtoJsonStr(member)); return LoginResponse.from(tokenIssue, member); } + private void storeValueInCookie( + HttpServletResponse response, String key, String value + ) { + ResponseCookie cookie = ResponseCookie + .from(key, value) + .httpOnly(true) + .secure(true) + .path("/") +// .domain("weplanplans.site") //todo: 서브도메인 맞춰야함 + .sameSite("None") + .build(); + response.addHeader("Set-Cookie", cookie.toString()); + } + + private String getMemberDtoJsonStr(Member member) { + try { + MemberDetailResponse memberDto = MemberDetailResponse.from(member); + return objectMapper.writeValueAsString(memberDto); + } catch (JsonProcessingException e) { + throw new JsonProcessFailedException(); + } + } + @Transactional public void logout(String refreshToken) { String email = jwtProvider.getEmail(refreshToken); From 881a034290658c269e619f762ed752654c7c6296 Mon Sep 17 00:00:00 2001 From: tjdtn0219 Date: Sun, 21 Jan 2024 15:29:41 +0900 Subject: [PATCH 2/2] =?UTF-8?q?style:=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yanabada/domain/auth/service/AuthService.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/auth/service/AuthService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/auth/service/AuthService.java index f0330ac3..83ebc1f0 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/auth/service/AuthService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/auth/service/AuthService.java @@ -100,13 +100,13 @@ public LoginResponse login( UsernamePasswordAuthenticationToken authenticationToken = loginRequest.toAuthentication(); authenticationManagerBuilder.getObject().authenticate(authenticationToken); - Member member = memberRepository.getMember(loginRequest.email(), EMAIL); TokenIssueResponse tokenIssue = tokenService.getTokenIssue(loginRequest.email(), EMAIL.name()); if (tokenIssue == null) { tokenIssue = jwtProvider .generateTokenInfo(loginRequest.email(), ROLE_USER.name(), EMAIL.name()); } + Member member = memberRepository.getMember(loginRequest.email(), EMAIL); storeValueInCookie(response, "accessToken", tokenIssue.accessToken()); storeValueInCookie(response, "refreshToken", tokenIssue.refreshToken()); storeValueInCookie(response, "member", getMemberDtoJsonStr(member)); @@ -119,13 +119,13 @@ public LoginResponse loginOauth( LoginRequest loginRequest, ProviderType providerType ) { - Member member = memberRepository.getMember(loginRequest.email(), providerType); TokenIssueResponse tokenIssue = tokenService.getTokenIssue(loginRequest.email(), providerType.name()); if (tokenIssue == null) { tokenIssue = jwtProvider .generateTokenInfo(loginRequest.email(), ROLE_USER.name(), providerType.name()); } + Member member = memberRepository.getMember(loginRequest.email(), providerType); storeValueInCookie(response, "accessToken", tokenIssue.accessToken()); storeValueInCookie(response, "refreshToken", tokenIssue.refreshToken()); storeValueInCookie(response, "member", getMemberDtoJsonStr(member)); @@ -140,9 +140,8 @@ private void storeValueInCookie( .httpOnly(true) .secure(true) .path("/") -// .domain("weplanplans.site") //todo: 서브도메인 맞춰야함 .sameSite("None") - .build(); + .build(); //todo: domain 서브도메인 맞추기 response.addHeader("Set-Cookie", cookie.toString()); }