Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ public enum ErrorStatus implements BaseErrorCode {
//로그인 관련 에러
_NOT_FOUND_USER(HttpStatus.NOT_FOUND, "USER401", "해당 유저를 찾을 수 없습니다."),
_EXIST_EMAIL(HttpStatus.BAD_REQUEST, "USER402", "중복된 이메일입니다."),
_NOT_CORRECT_PASSWORD(HttpStatus.BAD_REQUEST, "USER405", "비밀번호가 틀립니다.")
_NOT_CORRECT_PASSWORD(HttpStatus.BAD_REQUEST, "USER405", "비밀번호가 틀립니다."),
_NOT_FOUND_COOKIE(HttpStatus.NOT_FOUND, "USER403", "쿠키가 없습니다.")
;

private final HttpStatus httpStatus;
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/com/example/be/service/JwtUtilServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
Expand Down Expand Up @@ -107,5 +109,18 @@ public boolean isTokenExpired(String token) {
log.warn("유효하지 않은 토큰입니다.");
throw new TokenException(TokenErrorResult.INVALID_TOKEN);
}

}
public String extractTokenFromCookie(HttpServletRequest request, String cookieName) {
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
if(cookie.getName().equals(cookieName)) {
return cookie.getValue();
}
}
}
throw new UserHandler(ErrorStatus._NOT_FOUND_COOKIE);
}

}
45 changes: 45 additions & 0 deletions src/main/java/com/example/be/service/UserServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.example.be.web.dto.CommonDTO;
import com.example.be.web.dto.UserDTO;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -104,4 +105,48 @@ public CommonDTO.IsSuccessDTO login(UserDTO.LoginRequestDto request, HttpServlet
.isSuccess(true)
.build();
}

public UserDTO.UserResponseDto getUserInfo(String accessToken) {
// 토큰이 없는 경우 처리
if(accessToken == null) {
throw new UserHandler(ErrorStatus._NOT_FOUND_USER);
}

// 토큰에서 사용자 ID 추출
String userId = jwtUtil.getUserIdFromToken(accessToken);

// 사용자 정보 조회
User user = userRepository.findByUserId(UUID.fromString(userId))
.orElseThrow(() -> new UserHandler(ErrorStatus._NOT_FOUND_USER));

// UserResponseDto로 변환하여 반환
return UserDTO.UserResponseDto.builder()
.userId(user.getId())
.userName(user.getName())
.email(user.getEmail())
.loginType(user.getProvider())
.build();
}
public CommonDTO.IsSuccessDTO logout(HttpServletResponse response, HttpServletRequest request) {
Cookie[] cookies = request.getCookies();

if(cookies == null) {
throw new UserHandler(ErrorStatus._NOT_FOUND_COOKIE);
}

Cookie access = new Cookie("accessToken", null);
Cookie refresh = new Cookie("refreshToken", null);

access.setPath("/");
refresh.setPath("/");

access.setMaxAge(0);
refresh.setMaxAge(0);

response.addCookie(access);
response.addCookie(refresh);

return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build();
}

}
68 changes: 12 additions & 56 deletions src/main/java/com/example/be/web/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,94 +3,50 @@
import com.example.be.apiPayload.ApiResponse;
import com.example.be.apiPayload.code.status.ErrorStatus;
import com.example.be.apiPayload.exception.handler.UserHandler;
import com.example.be.domain.User;
import com.example.be.repository.UserRepository;
import com.example.be.service.JwtUtilServiceImpl;
import com.example.be.service.UserServiceImpl;
import com.example.be.web.dto.CommonDTO;
import com.example.be.web.dto.UserDTO;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.actuate.autoconfigure.metrics.SystemMetricsAutoConfiguration;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final UserServiceImpl userService;
private final SystemMetricsAutoConfiguration systemMetricsAutoConfiguration;
private final JwtUtilServiceImpl jwtUtilServiceImpl;
private final UserRepository userRepository;

@Hidden
@GetMapping("/socialLogin")
public ResponseEntity<?> handleLoginRedirect(
@RequestParam String name,
@RequestParam String access_token,
@RequestParam String refresh_token) {

return ResponseEntity.ok("로그인 성공");
}
private final JwtUtilServiceImpl jwtUtilService;

@PostMapping("/signup")
@Operation(summary = "회원가입 API")
public ApiResponse<CommonDTO.IsSuccessDTO> signup(@RequestBody UserDTO.SingUpRequestDto request) {

return ApiResponse.onSuccess(userService.signUp(request));
}

@PostMapping("/login")
@Operation(summary = "로그인 API")
public ApiResponse<CommonDTO.IsSuccessDTO> login(@RequestBody UserDTO.LoginRequestDto request, HttpServletResponse response) {

return ApiResponse.onSuccess(userService.login(request, response));
}

@PostMapping("/info")
@Operation(summary = "유저 정보 반환 API")
public ApiResponse<UserDTO.UserResponseDto> userInfo(HttpServletRequest request) {
String accessToken = null;
Cookie[] cookies = request.getCookies();

if(cookies != null) {
for(Cookie cookie : cookies) {
if(cookie.getName().equals("accessToken")) {
accessToken = cookie.getValue();
}
}
}
System.out.println(accessToken);
// 쿠키에서 액세스 토큰 추출은 서비스로 이동
String accessToken = jwtUtilService.extractTokenFromCookie(request, "accessToken");

// 토큰이 없는 경우 처리
if(accessToken == null) {
throw new UserHandler(ErrorStatus._NOT_FOUND_USER);
}

// 토큰에서 사용자 ID 추출
String userId = jwtUtilServiceImpl.getUserIdFromToken(accessToken);

// 사용자 정보 조회
User user = userRepository.findByUserId(UUID.fromString(userId))
.orElseThrow(() -> new UserHandler(ErrorStatus._NOT_FOUND_USER));

// UserResponseDto로 변환하여 반환
UserDTO.UserResponseDto userResponseDto = UserDTO.UserResponseDto.builder()
.userId(user.getId())
.userName(user.getName())
.email(user.getEmail())
.loginType(user.getProvider())
.build();

return ApiResponse.onSuccess(userResponseDto); }
// 사용자 정보 조회 로직도 서비스로 이동
return ApiResponse.onSuccess(userService.getUserInfo(accessToken));
}

}
@PostMapping("/logout")
@Operation(summary = "로그아웃 API")
public ApiResponse<CommonDTO.IsSuccessDTO> logout(HttpServletResponse response, HttpServletRequest request) {
return ApiResponse.onSuccess(userService.logout(response, request));
}
}