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
@@ -1,6 +1,5 @@
package com.proovy.domain.auth.controller;

import com.proovy.domain.auth.dto.request.GoogleLoginRequest;
import com.proovy.domain.auth.dto.request.KakaoLoginRequest;
import com.proovy.domain.auth.dto.request.LogoutRequest;
import com.proovy.domain.auth.dto.request.NaverLoginRequest;
Expand Down Expand Up @@ -91,28 +90,6 @@ public ResponseEntity<ApiResponse<LoginResponse>> naverLogin(
return ResponseEntity.ok(ApiResponse.success(message, response));
}

@PostMapping("/login/google")
@Operation(
operationId = "04_googleLogin",
summary = "구글 소셜 로그인",
description = "구글 인가 코드로 로그인합니다. 신규 유저는 회원가입 토큰을 반환합니다.")
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "로그인 성공"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Redirect URI 불일치 (AUTH4001)"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "유효하지 않은 인증 코드 (AUTH4011)"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "502", description = "구글 서버 오류 (AUTH5023)")
})
public ResponseEntity<ApiResponse<LoginResponse>> googleLogin(
@Valid @RequestBody GoogleLoginRequest request
) {
LoginResponse response = authService.googleLogin(request);

String message = "SIGNUP_REQUIRED".equals(response.loginType())
? "추가 정보 입력이 필요합니다."
: "로그인에 성공했습니다.";

return ResponseEntity.ok(ApiResponse.success(message, response));
}

@PostMapping("/signup/complete")
@Operation(
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ public record LoginResponse(
TokenDto token, // 기존 유저인 경우 JWT 토큰
String signupToken, // 신규 유저인 경우 회원가입용 임시 토큰
KakaoUserInfo kakaoInfo, // 신규 유저인 경우 카카오에서 받은 정보
NaverUserInfo naverInfo, // 네이버 신규 유저
GoogleUserInfo googleInfo // 구글 신규 유저
NaverUserInfo naverInfo // 네이버 신규 유저
) {
public static LoginResponse login(UserDto user, TokenDto token) {
return LoginResponse.builder()
Expand Down Expand Up @@ -38,12 +37,4 @@ public static LoginResponse signupRequired(String signupToken, NaverUserInfo nav
.build();
}

// 구글 신규 유저
public static LoginResponse signupRequired(String signupToken, GoogleUserInfo googleInfo) {
return LoginResponse.builder()
.loginType("SIGNUP_REQUIRED")
.signupToken(signupToken)
.googleInfo(googleInfo)
.build();
}
}
105 changes: 0 additions & 105 deletions src/main/java/com/proovy/domain/auth/provider/GoogleOAuthClient.java

This file was deleted.

46 changes: 0 additions & 46 deletions src/main/java/com/proovy/domain/auth/service/AuthService.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
package com.proovy.domain.auth.service;

import com.proovy.domain.auth.dto.google.GoogleTokenResponse;
import com.proovy.domain.auth.dto.google.GoogleUserResponse;
import com.proovy.domain.auth.dto.kakao.KakaoTokenResponse;
import com.proovy.domain.auth.dto.kakao.KakaoUserResponse;
import com.proovy.domain.auth.dto.naver.NaverTokenResponse;
import com.proovy.domain.auth.dto.naver.NaverUserResponse;
import com.proovy.domain.auth.dto.request.GoogleLoginRequest;
import com.proovy.domain.auth.dto.request.KakaoLoginRequest;
import com.proovy.domain.auth.dto.request.NaverLoginRequest;
import com.proovy.domain.auth.dto.request.SignupCompleteRequest;
import com.proovy.domain.auth.dto.response.*;
import com.proovy.domain.auth.entity.NaverState;
import io.jsonwebtoken.Claims;
import com.proovy.domain.auth.entity.RefreshToken;
import com.proovy.domain.auth.provider.GoogleOAuthClient;
import com.proovy.domain.auth.provider.KakaoOAuthClient;
import com.proovy.domain.auth.provider.NaverOAuthClient;
import com.proovy.domain.auth.repository.NaverStateRepository;
Expand Down Expand Up @@ -46,7 +42,6 @@ public class AuthService {

private final KakaoOAuthClient kakaoClient;
private final NaverOAuthClient naverClient;
private final GoogleOAuthClient googleClient;
private final NaverStateRepository naverStateRepository;
private final UserRepository userRepository;
private final JwtTokenProvider jwtTokenProvider;
Expand Down Expand Up @@ -163,47 +158,6 @@ public LoginResponse naverLogin(@Valid NaverLoginRequest request) {
}
}

/**
* 구글 로그인 처리
*/
@Transactional
public LoginResponse googleLogin(GoogleLoginRequest request) {
// 1. 구글 액세스 토큰 발급
GoogleTokenResponse googleToken = googleClient.getAccessToken(
request.authorizationCode()
);
log.info("구글 토큰 발급 성공, expires_in: {}", googleToken.expiresIn());

// 2. 구글 사용자 정보 조회
GoogleUserResponse googleUser = googleClient.getUserInfo(googleToken.accessToken());
log.info("구글 사용자 정보 조회 성공, id: {}", googleUser.id());

// 3. 기존 유저 조회 (OAuthProvider enum 사용)
String providerUserId = googleUser.id();
Optional<User> existingUser = userRepository
.findByProviderAndProviderUserId(OAuthProvider.GOOGLE, providerUserId);

// 4. 분기 처리
if (existingUser.isPresent()) {
// 기존 유저: JWT 발급
User user = existingUser.get();
TokenDto tokens = jwtTokenProvider.generateTokens(user.getId());

// Refresh Token Redis 저장
saveRefreshToken(user.getId(), tokens.refreshToken());

log.info("기존 유저 로그인 성공 (구글), userId: {}", user.getId());
return LoginResponse.login(UserDto.from(user), tokens);

} else {
// 신규 유저: signupToken 발급
GoogleUserInfo googleInfo = GoogleUserInfo.from(googleUser);
String signupToken = jwtTokenProvider.generateSignupToken(googleInfo);

log.info("신규 유저 감지 (구글), 회원가입 필요, googleId: {}", googleUser.id());
return LoginResponse.signupRequired(signupToken, googleInfo);
}
}

/**
* 회원가입 완료 처리
Expand Down
19 changes: 0 additions & 19 deletions src/main/java/com/proovy/domain/auth/service/JwtTokenProvider.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.proovy.domain.auth.service;

import com.proovy.domain.auth.dto.response.GoogleUserInfo;
import com.proovy.domain.auth.dto.response.KakaoUserInfo;
import com.proovy.domain.auth.dto.response.NaverUserInfo;
import com.proovy.domain.auth.dto.response.TokenDto;
Expand Down Expand Up @@ -107,24 +106,6 @@ public String generateSignupToken(NaverUserInfo naverInfo) {
.compact();
}

/**
* 회원가입용 임시 토큰 생성 (구글 정보 포함)
* 구글은 이름도 포함 (null 가능)
*/
public String generateSignupToken(GoogleUserInfo googleInfo) {
Date now = new Date();

return Jwts.builder()
.subject(googleInfo.id())
.claim("type", "signup")
.claim("provider", "GOOGLE")
.claim("email", googleInfo.email())
.claim("name", googleInfo.name())
.issuedAt(now)
.expiration(new Date(now.getTime() + signupTokenExpiration))
.signWith(secretKey)
.compact();
}

/**
* 토큰에서 userId 추출
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@

public enum OAuthProvider {
KAKAO("/images/logo/kakao.png"),
NAVER("/images/logo/naver.png"),
GOOGLE("/images/logo/google.png");
NAVER("/images/logo/naver.png");
Comment thread
coderabbitai[bot] marked this conversation as resolved.

private final String logoUrl;

Expand Down
7 changes: 0 additions & 7 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,6 @@ oauth:
# state 유효 시간 (초)
state-ttl: 300

google:
client-id: ${GOOGLE_CLIENT_ID}
client-secret: ${GOOGLE_CLIENT_SECRET}
redirect-uri: ${GOOGLE_REDIRECT_URI:http://localhost:5173/oauth/google/callback}
# 구글 API 엔드포인트
token-uri: https://oauth2.googleapis.com/token
user-info-uri: https://www.googleapis.com/oauth2/v2/userinfo

# ===============================
# JWT 설정 (서비스 자체 토큰)
Expand Down
Loading