Skip to content

Commit d96b2ef

Browse files
authored
[Release] v2.1.3 login v2 적용 & Slack 채널명 변경
[Release] v2.1.3 login v2 적용 & Slack 채널명 변경
2 parents fa15223 + df29bb5 commit d96b2ef

File tree

20 files changed

+289
-102
lines changed

20 files changed

+289
-102
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package ssu.eatssu.domain.auth.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import ssu.eatssu.domain.user.entity.DeviceType;
5+
import ssu.eatssu.global.log.annotation.LogMask;
6+
7+
// 애플 계정을 통해서 갤럭시 기기에도 접속을 할 수도 있다고 생각해서, DeviceType을 받도록 설계
8+
@Schema(title = "애플 로그인 및 회원가입 V2")
9+
public record AppleLoginRequestV2(
10+
@LogMask
11+
@Schema(description = "identityToken", example = "eyJraWQiOiJXNldjT0tCIiwiYWxnIjoi...")
12+
String identityToken,
13+
@Schema(description = "deviceType", example = "IOS")
14+
DeviceType deviceType
15+
) {}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ssu.eatssu.domain.auth.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.Email;
5+
import jakarta.validation.constraints.NotBlank;
6+
import ssu.eatssu.domain.user.entity.DeviceType;
7+
import ssu.eatssu.global.log.annotation.LogMask;
8+
9+
@Schema(title = "카카오 로그인 및 회원가입 V2")
10+
public record KakaoLoginRequestV2(
11+
@LogMask
12+
@NotBlank(message = "이메일을 입력해주세요.")
13+
@Email(message = "올바른 이메일 주소를 입력해주세요.")
14+
@Schema(description = "이메일", example = "[email protected]")
15+
String email,
16+
@LogMask
17+
@Schema(description = "providerId", example = "10378247832195")
18+
String providerId,
19+
@Schema(description = "deviceType", example = "IOS")
20+
DeviceType deviceType
21+
) {}

src/main/java/ssu/eatssu/domain/auth/infrastructure/SecurityConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class SecurityConfig {
2727
};
2828

2929
private static final String[] AUTH_WHITELIST = {
30-
"/", "/oauths/kakao", "/oauths/apple", "/menus/**", "/meals/**", "/admin/login",
30+
"/", "/oauths/kakao", "/oauths/apple", "/menus/**", "/meals/**", "/admin/login", "/oauths/v2/kakao","/oauths/v2/apple",
3131
"/reviews", "/reviews/menus/**", "/reviews/meals/**", "/v2/reviews/statistics/**",
3232
"/v2/reviews/menus/**", "/v2/reviews/meals/**", "/actuator/**", "/error-test/**"
3333
};

src/main/java/ssu/eatssu/domain/auth/presentation/OAuthController.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@
1313
import org.springframework.web.bind.annotation.RequestBody;
1414
import org.springframework.web.bind.annotation.RequestMapping;
1515
import org.springframework.web.bind.annotation.RestController;
16-
import ssu.eatssu.domain.auth.dto.AppleLoginRequest;
17-
import ssu.eatssu.domain.auth.dto.KakaoLoginRequest;
18-
import ssu.eatssu.domain.auth.dto.ValidRequest;
16+
import ssu.eatssu.domain.auth.dto.*;
1917
import ssu.eatssu.domain.auth.service.OAuthService;
2018
import ssu.eatssu.domain.user.dto.Tokens;
2119
import ssu.eatssu.global.handler.response.BaseResponse;
@@ -31,6 +29,7 @@ public class OAuthController {
3129

3230
private final OAuthService oauthService;
3331

32+
// TODO : 로그인 & 회원 가입 마이그레이션 이후에 지울 것.
3433
@Operation(summary = "카카오 회원가입, 로그인 [인증 토큰 필요 X]", description = """
3534
카카오 회원가입, 로그인 API 입니다.<br><br>
3635
가입된 회원일 경우 카카오 로그인, 미가입 회원일 경우 회원가입 후 자동 로그인됩니다.
@@ -49,6 +48,25 @@ public BaseResponse<Tokens> kakaoLogin(@Valid @RequestBody KakaoLoginRequest req
4948
return BaseResponse.success(tokens);
5049
}
5150

51+
@Operation(summary = "카카오 회원가입, 로그인 V2 [인증 토큰 필요 X]", description = """
52+
카카오 회원가입, 로그인 V2 API 입니다.<br><br>
53+
가입된 회원일 경우 카카오 로그인, 미가입 회원일 경우 회원가입 후 자동 로그인됩니다.
54+
""")
55+
@ApiResponses(value = {
56+
@ApiResponse(responseCode = "200", description = "카카오 회원가입/로그인 성공")
57+
})
58+
@PostMapping("/v2/kakao")
59+
public BaseResponse<Tokens> kakaoLoginV2(@Valid @RequestBody KakaoLoginRequestV2 request) {
60+
long startTime = System.currentTimeMillis();
61+
Tokens tokens = oauthService.kakaoLoginV2(request);
62+
long endTime = System.currentTimeMillis();
63+
long duration = endTime - startTime;
64+
log.info("OAuthWarmupRunner 완료 - 소요 시간: {} ms", duration);
65+
66+
return BaseResponse.success(tokens);
67+
}
68+
69+
// TODO : 로그인 & 회원 가입 마이그레이션 이후에 지울 것.
5270
@Operation(summary = "애플 회원가입, 로그인 [인증 토큰 필요 X]", description = """
5371
애플 로그인, 회원가입 API 입니다.<br><br>
5472
가입된 회원일 경우 카카오 로그인, 미가입 회원일 경우 회원가입 후 자동 로그인됩니다.
@@ -62,6 +80,19 @@ public BaseResponse<Tokens> appleLogin(@Valid @RequestBody AppleLoginRequest req
6280
return BaseResponse.success(tokens);
6381
}
6482

83+
@Operation(summary = "애플 회원가입, 로그인 V2 [인증 토큰 필요 X]", description = """
84+
애플 로그인, 회원가입 API V2 입니다.<br><br>
85+
가입된 회원일 경우 카카오 로그인, 미가입 회원일 경우 회원가입 후 자동 로그인됩니다.
86+
""")
87+
@ApiResponses(value = {
88+
@ApiResponse(responseCode = "200", description = "애플 회원가입/로그인 성공")
89+
})
90+
@PostMapping("/v2/apple")
91+
public BaseResponse<Tokens> appleLoginV2(@Valid @RequestBody AppleLoginRequestV2 request) {
92+
Tokens tokens = oauthService.appleLoginV2(request);
93+
return BaseResponse.success(tokens);
94+
}
95+
6596
@Operation(summary = "토큰 재발급", description = "accessToken, refreshToken 재발급 API 입니다.")
6697
@ApiResponses(value = {
6798
@ApiResponse(responseCode = "200", description = "토큰 재발급 성공")

src/main/java/ssu/eatssu/domain/auth/security/CustomUserDetails.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.springframework.security.core.GrantedAuthority;
66
import org.springframework.security.core.authority.SimpleGrantedAuthority;
77
import org.springframework.security.core.userdetails.UserDetails;
8+
import ssu.eatssu.domain.user.entity.DeviceType;
89
import ssu.eatssu.domain.user.entity.User;
910

1011
import java.util.ArrayList;
@@ -17,12 +18,14 @@ public class CustomUserDetails implements UserDetails {
1718
private final String email;
1819
private final String credentials;
1920
private final GrantedAuthority role;
21+
private final DeviceType deviceType;
2022

2123
public CustomUserDetails(User user) {
2224
this.id = user.getId();
2325
this.email = user.getEmail();
2426
this.credentials = user.getCredentials();
2527
this.role = user.getRole();
28+
this.deviceType = user.getDeviceType();
2629
}
2730

2831
@Override

src/main/java/ssu/eatssu/domain/auth/security/JwtAuthenticationFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public class JwtAuthenticationFilter extends GenericFilterBean {
3131
"/v2/reviews/menus/**", "/v2/reviews/meals/**", "/actuator/**", "/error-test/**",
3232
"/swagger-ui.html", "/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**",
3333
"/oauths/valid/token", "/admin/img/**", "/css/**", "/js/**",
34-
"/favicon.ico", "/error/**", "/webjars/**", "/h2-console/**"
35-
);
34+
"/favicon.ico", "/error/**", "/webjars/**", "/h2-console/**",
35+
"/oauths/v2/kakao", "/oauths/v2/apple");
3636
private final JwtTokenProvider jwtTokenProvider;
3737

3838
@Override

src/main/java/ssu/eatssu/domain/auth/security/JwtTokenProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public Authentication getAuthentication(String token) throws JsonProcessingExcep
146146
UserPrincipalDto userPrincipalDto = objectMapper.readValue(claims.getSubject(), UserPrincipalDto.class);
147147

148148
CustomUserDetails principal = new CustomUserDetails(userPrincipalDto.getId(), userPrincipalDto.getEmail(), "",
149-
authorities.get(0));
149+
authorities.get(0),userPrincipalDto.getDeviceType());
150150

151151
return new UsernamePasswordAuthenticationToken(principal, token, authorities);
152152
}

src/main/java/ssu/eatssu/domain/auth/security/UserPrincipalDto.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.Builder;
55
import lombok.Getter;
66
import lombok.NoArgsConstructor;
7+
import ssu.eatssu.domain.user.entity.DeviceType;
78

89
@Getter
910
@Builder
@@ -12,13 +13,15 @@
1213
public class UserPrincipalDto {
1314
private Long id;
1415
private String email;
16+
private DeviceType deviceType;
1517
private String role;
1618

1719
public static UserPrincipalDto from(CustomUserDetails userDetails) {
1820
return UserPrincipalDto.builder()
1921
.id(userDetails.getId())
2022
.email(userDetails.getEmail())
23+
.deviceType(userDetails.getDeviceType())
2124
.role(userDetails.getRole().getAuthority())
2225
.build();
2326
}
24-
}
27+
}

src/main/java/ssu/eatssu/domain/auth/service/OAuthService.java

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@
66
import org.springframework.security.core.Authentication;
77
import org.springframework.stereotype.Service;
88
import org.springframework.transaction.annotation.Transactional;
9-
import ssu.eatssu.domain.auth.dto.AppleLoginRequest;
10-
import ssu.eatssu.domain.auth.dto.KakaoLoginRequest;
11-
import ssu.eatssu.domain.auth.dto.OAuthInfo;
12-
import ssu.eatssu.domain.auth.dto.ValidRequest;
9+
import ssu.eatssu.domain.auth.dto.*;
1310
import ssu.eatssu.domain.auth.entity.AppleAuthenticator;
1411
import ssu.eatssu.domain.auth.entity.OAuthProvider;
1512
import ssu.eatssu.domain.auth.security.JwtTokenProvider;
1613
import ssu.eatssu.domain.auth.util.RandomNicknameUtil;
1714
import ssu.eatssu.domain.user.dto.Tokens;
15+
import ssu.eatssu.domain.user.entity.DeviceType;
1816
import ssu.eatssu.domain.user.entity.User;
1917
import ssu.eatssu.domain.user.repository.UserRepository;
2018
import ssu.eatssu.domain.user.service.UserService;
@@ -41,6 +39,21 @@ public Tokens kakaoLogin(KakaoLoginRequest request) {
4139
return generateOauthJwtTokens(user.getEmail(), KAKAO, request.providerId());
4240
}
4341

42+
/**
43+
* V1 -> V2로 넘어가면서 DeviceType(IOS,ANDROID) 정보를 추가로 받게 되었고, 기존에 가입한 유저들은 추가로 기입해 주게 됩니다.
44+
*/
45+
public Tokens kakaoLoginV2(KakaoLoginRequestV2 request) {
46+
User user = userRepository.findByProviderId(request.providerId())
47+
.orElseGet(() -> userService.joinV2(request.email(), KAKAO, request.providerId(),request.deviceType()));
48+
49+
if (user.getDeviceType() == null) {
50+
user.updateDeviceType(request.deviceType());
51+
}
52+
53+
return generateOauthJwtTokens(user.getEmail(), KAKAO, request.providerId());
54+
}
55+
56+
4457
public Tokens appleLogin(AppleLoginRequest request) {
4558
OAuthInfo oAuthInfo = appleAuthenticator.getOAuthInfoByIdentityToken(request.identityToken());
4659

@@ -52,6 +65,24 @@ public Tokens appleLogin(AppleLoginRequest request) {
5265
return generateOauthJwtTokens(user.getEmail(), APPLE, oAuthInfo.providerId());
5366
}
5467

68+
/**
69+
* V1 -> V2로 넘어가면서 DeviceType(IOS,ANDROID) 정보를 추가로 받게 되었고, 기존에 가입한 유저들은 추가로 기입해 주게 됩니다.
70+
*/
71+
public Tokens appleLoginV2(AppleLoginRequestV2 request) {
72+
OAuthInfo oAuthInfo = appleAuthenticator.getOAuthInfoByIdentityToken(request.identityToken());
73+
74+
User user = userRepository.findByProviderId(oAuthInfo.providerId())
75+
.orElseGet(() -> userService.joinV2(oAuthInfo.email(), APPLE, oAuthInfo.providerId(),request.deviceType()));
76+
77+
updateAppleUserEmail(user, oAuthInfo.email());
78+
79+
if (user.getDeviceType() == null) {
80+
user.updateDeviceType(request.deviceType());
81+
}
82+
83+
return generateOauthJwtTokens(user.getEmail(), APPLE, oAuthInfo.providerId());
84+
}
85+
5586
public Tokens refreshTokens(Authentication authentication) {
5687
return jwtTokenProvider.generateTokens(authentication);
5788
}
@@ -97,5 +128,4 @@ private Tokens generateOauthJwtTokens(String email, OAuthProvider provider, Stri
97128
private String makeOauthCredentials(OAuthProvider provider, String providerId) {
98129
return provider + providerId;
99130
}
100-
101131
}

src/main/java/ssu/eatssu/domain/inquiry/presentation/InquiryController.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
import ssu.eatssu.domain.slack.service.SlackService;
2222
import ssu.eatssu.global.handler.response.BaseResponse;
2323

24+
/**
25+
* 문의하기는 카카오톡으로 이동되어 사용되지 않고 있습니다.
26+
*/
27+
@Deprecated
2428
@RestController
2529
@RequiredArgsConstructor
2630
@RequestMapping("/inquiries")

0 commit comments

Comments
 (0)