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 @@ -36,7 +36,8 @@ public class MemberController {
@Operation(
summary = "구글 로그인 API",
description = "구글 인가코드을 통해 사용자의 정보를 등록 및 토큰 + 역할을 발급합니다. " +
"<br><br>[enum]ROLE -> 처음사용자 : GUEST, 일반사용자 : USER, 관리자 : ADMIN"
"<br>- type: 환경에 따라 local 또는 deploy를 보내주세요" +
"<br>- [enum]ROLE -> 처음사용자 : GUEST, 일반사용자 : USER, 관리자 : ADMIN"
)
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "로그인 성공"),
Expand All @@ -47,13 +48,15 @@ public class MemberController {
@PostMapping("/google/login")
public ResponseEntity<ApiResponse<LoginResponseDTO>> loginWithGoogle(@Valid @RequestBody LoginRequestDTO loginRequestDTO) {

LoginResponseDTO response = memberService.loginWithGoogle(loginRequestDTO.getCode());
LoginResponseDTO response = memberService.loginWithGoogle(loginRequestDTO.getCode(), loginRequestDTO.getType());
return ApiResponse.success(SuccessStatus.SEND_LOGIN_SUCCESS, response);
}

@Operation(
summary = "카카오 로그인 API",
description = "카카오 인가코드을 통해 사용자의 정보를 등록 및 토큰 + 역할을 발급합니다. (ROLE -> 처음사용자 : GUEST, 일반사용자 : USER, 관리자 : ADMIN)"
description = "카카오 인가코드을 통해 사용자의 정보를 등록 및 토큰 + 역할을 발급합니다." +
"<br>- type: 환경에 따라 local 또는 deploy를 보내주세요" +
"<br>- [enum]ROLE -> 처음사용자 : GUEST, 일반사용자 : USER, 관리자 : ADMIN"
)
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "로그인 성공"),
Expand All @@ -64,7 +67,7 @@ public ResponseEntity<ApiResponse<LoginResponseDTO>> loginWithGoogle(@Valid @Req
@PostMapping("/kakao/login")
public ResponseEntity<ApiResponse<LoginResponseDTO>> loginWithKakao(@Valid @RequestBody LoginRequestDTO loginRequestDTO) {

LoginResponseDTO response = memberService.loginWithKakao(loginRequestDTO.getCode());
LoginResponseDTO response = memberService.loginWithKakao(loginRequestDTO.getCode(), loginRequestDTO.getType());
return ApiResponse.success(SuccessStatus.SEND_LOGIN_SUCCESS, response);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ public class LoginRequestDTO {

@NotBlank(message = "인가코드가 입력되지 않았습니다.")
private String code; // 인가코드
private String type; // local, deploy
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,14 @@ public class GoogleOAuthService {
private String clientId;
@Value("${spring.security.oauth2.client.registration.google.client-secret}")
private String clientSecret;
@Value("${spring.security.oauth2.client.registration.google.redirect-uri}")
private String redirectUri;

@Value("${oauth-config.google.local}")
private String localRedirectUri;
@Value("${oauth-config.google.deploy}")
private String deployRedirectUri;

// Google 토큰 획득 로직 (WebClient 방식으로 수정 - 비동기 방식 구현)
public AccessTokenResponseDTO getGoogleToken(String code) {
public AccessTokenResponseDTO getGoogleToken(String code, String type) {

String decodedCode;
try {
Expand All @@ -48,6 +51,8 @@ public AccessTokenResponseDTO getGoogleToken(String code) {
decodedCode = code;
}

String redirectUri = "deploy".equalsIgnoreCase(type) ? deployRedirectUri : localRedirectUri;

// ... (실제 Google OAuth 2.0 /token 엔드포인트 통신 로직 구현 필요)
// HTTP Body에 전송할 파라미터 담기
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,23 @@ public class KakaoOAuthService {
private String clientId;
@Value("${spring.security.oauth2.client.registration.kakao.client-secret}")
private String clientSecret;
@Value("${spring.security.oauth2.client.registration.kakao.redirect-uri}")
private String redirectUri;

@Value("${oauth-config.google.local}")
private String localRedirectUri;
@Value("${oauth-config.google.deploy}")
private String deployRedirectUri;

// Kakao 토큰 획득 로직
public AccessTokenResponseDTO getKakaoToken(String code){
public AccessTokenResponseDTO getKakaoToken(String code, String type){

// HTTP Body 생성
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("client_id", clientId);
params.add("client_secret", clientSecret);

String redirectUri = "deploy".equalsIgnoreCase(type) ? deployRedirectUri : localRedirectUri;

params.add("redirect_uri", redirectUri);
params.add("code", code);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ public class MemberService {

// 인가코드 받아 JWT로 교환 및 회원가입/로그인 처리
@Transactional
public LoginResponseDTO loginWithGoogle(String code){
public LoginResponseDTO loginWithGoogle(String code, String type){

// 1. 인가 코드로 Google Access Token 및 사용자 정보 획득
AccessTokenResponseDTO tokenDTO = googleOAuthService.getGoogleToken(code);
AccessTokenResponseDTO tokenDTO = googleOAuthService.getGoogleToken(code, type);
GoogleInfoResponseDTO userInfo = googleOAuthService.getGoogleUserInfo(tokenDTO.getAccessToken());

// 2. 사용자 정보 추출
Expand Down Expand Up @@ -89,9 +89,9 @@ public LoginResponseDTO loginWithGoogle(String code){
}

@Transactional
public LoginResponseDTO loginWithKakao(String code){
public LoginResponseDTO loginWithKakao(String code, String type){

AccessTokenResponseDTO tokenDTO = kakaoOAuthService.getKakaoToken(code);
AccessTokenResponseDTO tokenDTO = kakaoOAuthService.getKakaoToken(code, type);
KakaoInfoResponseDTO userInfo = kakaoOAuthService.getKakaoUserInfo(tokenDTO.getAccessToken());

// 2. 사용자 정보 추출
Expand Down Expand Up @@ -138,9 +138,8 @@ private Member signUp(String socialId, String email, String name, String picture
.socialType(socialType)
.role(Role.GUEST) // 이후 필요 정보 모두 입력 시 USER 로 승격
.build();
Member savedMember = memberRepository.save(newUser);

return savedMember;
return memberRepository.save(newUser);
}

// 사용자 정보 조회
Expand Down