feat(로그아웃 및 점주 정보 API 구현): 고객 고유번호 리스트로 고객 가져오기 테스트

- 리프레시 토큰이 제대로 삭제되지 않는 문제 해결 (Path 및 maxAge 값 설정)
- 점주 고유번호로 점주 정보 가져오는 API 추가
This commit is contained in:
bum12ark
2022-03-18 12:40:33 +09:00
parent f37cd79cde
commit c46e4eb1f3
9 changed files with 56 additions and 18 deletions

View File

@@ -54,13 +54,15 @@ public class RefreshTokenServiceImpl implements RefreshTokenService {
// refresh token 검증 // refresh token 검증
String findRefreshTokenId = findRefreshToken.getRefreshTokenId(); String findRefreshTokenId = findRefreshToken.getRefreshTokenId();
if (!jwtTokenProvider.validateJwtToken(refreshToken) || if (!jwtTokenProvider.validateJwtToken(refreshToken)) {
!jwtTokenProvider.equalRefreshTokenId(findRefreshTokenId, refreshToken)) {
refreshTokenRedisRepository.delete(findRefreshToken); refreshTokenRedisRepository.delete(findRefreshToken);
throw new RefreshTokenNotValidException("Not validate jwt token = " + refreshToken); throw new RefreshTokenNotValidException("Not validate jwt token = " + refreshToken);
} }
if (!jwtTokenProvider.equalRefreshTokenId(findRefreshTokenId, refreshToken)) {
throw new RefreshTokenNotValidException("redis 의 값과 일치하지 않습니다. = " + refreshToken);
}
User findUser = userRepository.findById(Long.valueOf(userId)) User findUser = userRepository.findById(Long.valueOf(userId))
.orElseThrow(() -> new NotExistUserException("유저 고유 번호 : " + userId + "는 없는 유저입니다.")); .orElseThrow(() -> new NotExistUserException("유저 고유 번호 : " + userId + "는 없는 유저입니다."));
@@ -69,7 +71,7 @@ public class RefreshTokenServiceImpl implements RefreshTokenService {
List<String> roles = authentication.getAuthorities() List<String> roles = authentication.getAuthorities()
.stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList()); .stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
String newAccessToken = jwtTokenProvider.createJwtAccessToken(userId, "/refreshToken", roles); String newAccessToken = jwtTokenProvider.createJwtAccessToken(userId, "/reissu", roles);
Date expiredTime = jwtTokenProvider.getExpiredTime(newAccessToken); Date expiredTime = jwtTokenProvider.getExpiredTime(newAccessToken);
return JwtTokenDto.builder() return JwtTokenDto.builder()

View File

@@ -29,8 +29,8 @@ public class AuthController {
private final CookieProvider cookieProvider; private final CookieProvider cookieProvider;
@GetMapping("/reissue") @GetMapping("/reissue")
public ResponseEntity<Result> refreshToken(@RequestHeader("X-AUTH-TOKEN") String accessToken, public ResponseEntity<Result> refreshToken(@RequestHeader(value = "X-AUTH-TOKEN") String accessToken,
@CookieValue("refresh-token") String refreshToken) { @CookieValue(value = "refresh-token") String refreshToken) {
JwtTokenDto jwtTokenDto = refreshTokenService.refreshJwtToken(accessToken, refreshToken); JwtTokenDto jwtTokenDto = refreshTokenService.refreshJwtToken(accessToken, refreshToken);
ResponseCookie responseCookie = cookieProvider.createRefreshTokenCookie(refreshToken); ResponseCookie responseCookie = cookieProvider.createRefreshTokenCookie(refreshToken);
@@ -55,8 +55,7 @@ public class AuthController {
} }
@PostMapping("/logout") @PostMapping("/logout")
public ResponseEntity<Result> logout(@RequestHeader("X-AUTH-TOKEN") String accessToken, public ResponseEntity<Result> logout(@RequestHeader("X-AUTH-TOKEN") String accessToken) {
@RequestHeader("REFRESH-TOKEN") String refreshToken) {
refreshTokenService.logoutToken(accessToken); refreshTokenService.logoutToken(accessToken);
@@ -64,7 +63,7 @@ public class AuthController {
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.header(HttpHeaders.SET_COOKIE, refreshCookie.toString()) .header(HttpHeaders.SET_COOKIE, refreshCookie.toString())
.body(Result.createErrorResult("")); .body(Result.createSuccessResult(""));
} }
@GetMapping("/check/access-token") @GetMapping("/check/access-token")

View File

@@ -17,8 +17,8 @@ public class CustomerDto extends UserDto {
@Builder @Builder
public CustomerDto(Long id, String email, String password, String name, public CustomerDto(Long id, String email, String password, String name,
String phoneNumber, String dtype, String refreshTokenId) { String phoneNumber, String dtype) {
super(id, email, password, name, phoneNumber, dtype, refreshTokenId); super(id, email, password, name, phoneNumber, dtype);
} }
} }

View File

@@ -1,5 +1,6 @@
package com.justpickup.userservice.domain.user.dto; package com.justpickup.userservice.domain.user.dto;
import com.justpickup.userservice.domain.user.entity.StoreOwner;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
@@ -9,8 +10,13 @@ public class StoreOwnerDto extends UserDto {
@Builder @Builder
public StoreOwnerDto(Long id, String email, String password, String name, public StoreOwnerDto(Long id, String email, String password, String name,
String phoneNumber, String dtype, String businessNumber, String refreshTokenId) { String phoneNumber, String dtype, String businessNumber) {
super(id, email, password, name, phoneNumber, dtype, refreshTokenId); super(id, email, password, name, phoneNumber, dtype);
this.businessNumber = businessNumber; this.businessNumber = businessNumber;
} }
public static StoreOwnerDto of(StoreOwner storeOwner) {
return new StoreOwnerDto(storeOwner.getId(), storeOwner.getEmail(), storeOwner.getPassword(),
storeOwner.getName(), storeOwner.getPhoneNumber(), storeOwner.getDtype(), storeOwner.getBusinessNumber());
}
} }

View File

@@ -11,7 +11,6 @@ public abstract class UserDto {
private String name; private String name;
private String phoneNumber; private String phoneNumber;
private String dtype; private String dtype;
private String refreshTokenId;
// == 생성 메소드 == // // == 생성 메소드 == //
public UserDto(Customer customer) { public UserDto(Customer customer) {
@@ -23,13 +22,12 @@ public abstract class UserDto {
} }
public UserDto(Long id, String email, String password, String name, String phoneNumber, public UserDto(Long id, String email, String password, String name, String phoneNumber,
String dtype, String refreshTokenId) { String dtype) {
this.id = id; this.id = id;
this.email = email; this.email = email;
this.password = password; this.password = password;
this.name = name; this.name = name;
this.phoneNumber = phoneNumber; this.phoneNumber = phoneNumber;
this.dtype = dtype; this.dtype = dtype;
this.refreshTokenId = refreshTokenId;
} }
} }

View File

@@ -9,4 +9,5 @@ public interface UserService {
CustomerDto findCustomerByUserId(Long userId); CustomerDto findCustomerByUserId(Long userId);
void saveStoreOwner(StoreOwnerDto storeOwnerDto); void saveStoreOwner(StoreOwnerDto storeOwnerDto);
List<CustomerDto> findCustomerByUserIds(List<Long> userIds); List<CustomerDto> findCustomerByUserIds(List<Long> userIds);
StoreOwnerDto findOwnerById(Long userId);
} }

View File

@@ -8,6 +8,7 @@ import com.justpickup.userservice.domain.user.entity.User;
import com.justpickup.userservice.domain.user.exception.DuplicateUserEmail; import com.justpickup.userservice.domain.user.exception.DuplicateUserEmail;
import com.justpickup.userservice.domain.user.exception.NotExistUserException; import com.justpickup.userservice.domain.user.exception.NotExistUserException;
import com.justpickup.userservice.domain.user.repository.CustomerRepository; import com.justpickup.userservice.domain.user.repository.CustomerRepository;
import com.justpickup.userservice.domain.user.repository.StoreOwnerRepository;
import com.justpickup.userservice.domain.user.repository.UserRepository; import com.justpickup.userservice.domain.user.repository.UserRepository;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -32,6 +33,7 @@ import java.util.stream.Collectors;
public class UserServiceImpl implements UserService, UserDetailsService { public class UserServiceImpl implements UserService, UserDetailsService {
private final CustomerRepository customerRepository; private final CustomerRepository customerRepository;
private final StoreOwnerRepository storeOwnerRepository;
private final UserRepository userRepository; private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder; private final PasswordEncoder passwordEncoder;
@@ -77,4 +79,12 @@ public class UserServiceImpl implements UserService, UserDetailsService {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Override
public StoreOwnerDto findOwnerById(Long userId) {
StoreOwner storeOwner = storeOwnerRepository.findById(userId)
.orElseThrow(() -> new NotExistUserException(userId + "는 존재하지 않은 사용자입니다."));
return StoreOwnerDto.of(storeOwner);
}
} }

View File

@@ -26,8 +26,8 @@ public class UserController {
private final UserService userService; private final UserService userService;
@GetMapping("/customer/") @GetMapping("/customer")
public ResponseEntity getCustomerByToken(@Valid @RequestHeader(value = "user-id") String userId ) { public ResponseEntity getCustomerByToken(@Valid @RequestHeader(value="user-id") String userId) {
CustomerDto customerDto = userService.findCustomerByUserId(Long.parseLong(userId)); CustomerDto customerDto = userService.findCustomerByUserId(Long.parseLong(userId));
@@ -90,6 +90,26 @@ public class UserController {
} }
} }
@GetMapping("/store-owner")
public ResponseEntity<Result> getStoreOwnerByToken(@RequestHeader(value="user-id") String userHeader) {
Long userId = Long.valueOf(userHeader);
StoreOwnerDto storeOwnerDto = userService.findOwnerById(userId);
return ResponseEntity.ok(Result.createSuccessResult(storeOwnerDto));
}
@Data
static class StoreOwnerByTokenResponse {
private Long id;
private String name;
public StoreOwnerByTokenResponse(StoreOwnerDto dto) {
this.id = dto.getId();
this.name = dto.getName();
}
}
@PostMapping("/store-owner") @PostMapping("/store-owner")
public ResponseEntity<Result> joinStoreOwner(@Valid @RequestBody JoinStoreOwnerRequest joinRequest) { public ResponseEntity<Result> joinStoreOwner(@Valid @RequestBody JoinStoreOwnerRequest joinRequest) {
// 회원 가입 // 회원 가입

View File

@@ -22,6 +22,8 @@ public class CookieProvider {
public ResponseCookie removeRefreshTokenCookie() { public ResponseCookie removeRefreshTokenCookie() {
return ResponseCookie.from("refresh-token", null) return ResponseCookie.from("refresh-token", null)
.maxAge(0)
.path("/")
.build(); .build();
} }