From d0af7e44442bc767895bbdf3b8d60520320fdb87 Mon Sep 17 00:00:00 2001 From: Kim DongHyo <60608509+kdhyo@users.noreply.github.com> Date: Thu, 30 Jun 2022 16:31:54 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EC=8B=9C=20refreshToken=20=EC=A0=9C=EA=B1=B0=20(#44)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 로그아웃 시 refreshToken 제거 * refactor: deleteRefreshToken 메서드 람다활용 문법으로 변경 --- .../user/application/AuthController.java | 11 ++++++++ .../application/response/LogoutResponse.java | 28 +++++++++++++++++++ .../service/AuthenticationServiceImpl.java | 11 ++++++++ .../interfaces/AuthenticationService.java | 3 ++ 4 files changed, 53 insertions(+) create mode 100644 server/src/main/java/com/ticketing/server/user/application/response/LogoutResponse.java diff --git a/server/src/main/java/com/ticketing/server/user/application/AuthController.java b/server/src/main/java/com/ticketing/server/user/application/AuthController.java index 11d3243..e722e6f 100644 --- a/server/src/main/java/com/ticketing/server/user/application/AuthController.java +++ b/server/src/main/java/com/ticketing/server/user/application/AuthController.java @@ -1,6 +1,7 @@ package com.ticketing.server.user.application; import com.ticketing.server.user.application.request.LoginRequest; +import com.ticketing.server.user.application.response.LogoutResponse; import com.ticketing.server.user.application.response.TokenDto; import com.ticketing.server.user.service.interfaces.AuthenticationService; import lombok.RequiredArgsConstructor; @@ -8,6 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -40,6 +43,14 @@ public class AuthController { .body(tokenDto); } + @PostMapping("/logout") + public ResponseEntity logout(@AuthenticationPrincipal UserDetails userRequest) { + LogoutResponse logoutResponse = authenticationService.deleteRefreshToken(userRequest.getUsername()); + + return ResponseEntity.status(HttpStatus.OK) + .body(logoutResponse); + } + private HttpHeaders getHttpHeaders() { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate"); diff --git a/server/src/main/java/com/ticketing/server/user/application/response/LogoutResponse.java b/server/src/main/java/com/ticketing/server/user/application/response/LogoutResponse.java new file mode 100644 index 0000000..e2b2bf9 --- /dev/null +++ b/server/src/main/java/com/ticketing/server/user/application/response/LogoutResponse.java @@ -0,0 +1,28 @@ +package com.ticketing.server.user.application.response; + +import com.ticketing.server.global.redis.RefreshToken; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class LogoutResponse { + + private Long refreshTokenId; + private String email; + private String refreshToken; + + private LogoutResponse(String email) { + this.email = email; + } + + public static LogoutResponse from(String email) { + return new LogoutResponse(email); + } + + public static LogoutResponse from(RefreshToken refreshToken) { + return new LogoutResponse(refreshToken.getId(), refreshToken.getEmail(), refreshToken.getToken()); + } + +} diff --git a/server/src/main/java/com/ticketing/server/user/service/AuthenticationServiceImpl.java b/server/src/main/java/com/ticketing/server/user/service/AuthenticationServiceImpl.java index 4915754..cbfca8f 100644 --- a/server/src/main/java/com/ticketing/server/user/service/AuthenticationServiceImpl.java +++ b/server/src/main/java/com/ticketing/server/user/service/AuthenticationServiceImpl.java @@ -9,6 +9,7 @@ import com.ticketing.server.global.redis.RefreshRedisRepository; import com.ticketing.server.global.redis.RefreshToken; import com.ticketing.server.global.security.jwt.JwtProperties; import com.ticketing.server.global.security.jwt.JwtProvider; +import com.ticketing.server.user.application.response.LogoutResponse; import com.ticketing.server.user.application.response.TokenDto; import com.ticketing.server.user.service.interfaces.AuthenticationService; import lombok.RequiredArgsConstructor; @@ -79,6 +80,16 @@ public class AuthenticationServiceImpl implements AuthenticationService { return tokenDto; } + @Override + @Transactional + public LogoutResponse deleteRefreshToken(String email) { + return refreshRedisRepository.findByEmail(email) + .map(tokenDto -> { + refreshRedisRepository.delete(tokenDto); + return LogoutResponse.from(tokenDto); + }).orElseGet(() -> LogoutResponse.from(email)); + } + private String resolveToken(String bearerToken) { if (StringUtils.hasText(bearerToken) && jwtProperties.hasTokenStartsWith(bearerToken)) { return bearerToken.substring(7); diff --git a/server/src/main/java/com/ticketing/server/user/service/interfaces/AuthenticationService.java b/server/src/main/java/com/ticketing/server/user/service/interfaces/AuthenticationService.java index 7954395..e3fc99d 100644 --- a/server/src/main/java/com/ticketing/server/user/service/interfaces/AuthenticationService.java +++ b/server/src/main/java/com/ticketing/server/user/service/interfaces/AuthenticationService.java @@ -1,5 +1,6 @@ package com.ticketing.server.user.service.interfaces; +import com.ticketing.server.user.application.response.LogoutResponse; import com.ticketing.server.user.application.response.TokenDto; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -9,4 +10,6 @@ public interface AuthenticationService { TokenDto reissueTokenDto(String bearerRefreshToken); + LogoutResponse deleteRefreshToken(String email); + }