Skip to content

Commit 9857b7f

Browse files
authored
Merge pull request #13 from Neighbors-dev/develop
[FEAT] 로그인/비로그인 JWT 토큰 생성 로직 구현
2 parents 7609c7f + 6d665bd commit 9857b7f

File tree

26 files changed

+340
-90
lines changed

26 files changed

+340
-90
lines changed

src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ public enum BaseResponseMessage {
1616
유저_이름_변경이_완료되었습니다("유저 이름 변경이 완료되었습니다"),
1717
존재하지_않는_유저입니다("존재하지 않는 유저입니다"),
1818
유저_이름의_길이는_1부터_5까지만_가능합니다("유저 이름의 길이는 1부터 5까지만 가능합니다"),
19+
ROLE_필드는_필수입력입니다("ROLE 필드는 필수입력입니다"),
20+
이메일_형식이_올바르지_못합니다("이메일 형식이 올바르지 못합니다"),
21+
유저가_성공적으로_인증되었습니다("유저가 성공적으로 인증되었습니다"),
22+
GUEST_유저_토큰이_정상적으로_생성되었습니다("GUEST 유저 토큰이 정상적으로 생성되었습니다"),
1923

2024
//jwt error message
2125
JWT_토큰_오류입니다("JWT 토큰 오류입니다"),
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.neighbors.tohero.application.letter.dto;
2+
3+
public record CreateLetterRequest (
4+
5+
){
6+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.neighbors.tohero.application.letter.service;
2+
3+
import com.neighbors.tohero.application.baseResponse.BaseResponse;
4+
import com.neighbors.tohero.application.letter.dto.CreateLetterRequest;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
8+
@Service
9+
@RequiredArgsConstructor
10+
public class LetterService {
11+
12+
public BaseResponse createLetter(CreateLetterRequest createLetterRequest) {
13+
return null;
14+
}
15+
}
Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,38 @@
11
package com.neighbors.tohero.application.login.dto;
22

33
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.neighbors.tohero.common.enums.Role;
45
import com.neighbors.tohero.common.jwt.AuthTokens;
6+
import com.neighbors.tohero.domain.domain.user.model.User;
57
import lombok.Builder;
68
import lombok.Data;
79

8-
@Builder
9-
@Data
10-
public class OAuthLoginResponse {
11-
private boolean isMember;
10+
public record OAuthLoginResponse (
11+
boolean isMember,
1212

13-
@JsonInclude(JsonInclude.Include.NON_NULL)
14-
private AuthTokens authTokens;
13+
@JsonInclude(JsonInclude.Include.NON_NULL)
14+
UserInfo userInfo,
1515

16-
@JsonInclude(JsonInclude.Include.NON_NULL)
17-
private String email;
16+
@JsonInclude(JsonInclude.Include.NON_NULL)
17+
AuthTokens authTokens,
1818

19-
public static OAuthLoginResponse createSuccessObjFrom(AuthTokens authTokens, String email) {
20-
return OAuthLoginResponse.builder()
21-
.authTokens(authTokens)
22-
.email(email)
23-
.isMember(true)
24-
.build();
19+
@JsonInclude(JsonInclude.Include.NON_NULL)
20+
String email
21+
){
22+
public record UserInfo(
23+
long userId,
24+
String nickname,
25+
String email,
26+
Role role
27+
){
28+
}
29+
30+
public static OAuthLoginResponse createNonUserResponse(String email){
31+
return new OAuthLoginResponse(false, null, null, email);
32+
}
33+
34+
public static OAuthLoginResponse createExistUserResponse(User user, AuthTokens authTokens){
35+
UserInfo userInfo = new UserInfo(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole());
36+
return new OAuthLoginResponse(true, userInfo, authTokens,null);
2537
}
2638
}

src/main/java/com/neighbors/tohero/application/login/service/OAuthService.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,28 @@
55
import com.neighbors.tohero.application.baseResponse.BaseResponse;
66
import com.neighbors.tohero.application.baseResponse.BaseResponseMessage;
77
import com.neighbors.tohero.application.baseResponse.BaseResponseStatus;
8-
import com.neighbors.tohero.common.enums.Role;
8+
import com.neighbors.tohero.common.exception.user.UserException;
99
import com.neighbors.tohero.common.jwt.AuthTokens;
1010
import com.neighbors.tohero.common.jwt.JwtProvider;
1111
import com.neighbors.tohero.common.jwt.JwtUserDetails;
12-
import com.neighbors.tohero.domain.domain.login.model.User;
13-
import com.neighbors.tohero.domain.domain.login.service.CreateUser;
12+
import com.neighbors.tohero.domain.domain.user.model.User;
13+
import com.neighbors.tohero.domain.domain.user.service.CreateUser;
1414
import com.neighbors.tohero.domain.domain.login.service.oauth.kakao.RequestKakaoInfo;
15+
import com.neighbors.tohero.domain.domain.user.service.GetUser;
1516
import lombok.RequiredArgsConstructor;
1617
import lombok.extern.slf4j.Slf4j;
1718
import org.springframework.beans.factory.annotation.Value;
1819
import org.springframework.stereotype.Service;
1920

21+
import java.util.Optional;
22+
2023
@Slf4j
2124
@Service
2225
@RequiredArgsConstructor
2326
public class OAuthService {
2427

2528
private final RequestKakaoInfo requestUserInfo;
26-
private final CreateUser createUser;
29+
private final GetUser getUser;
2730
private final JwtProvider jwtProvider;
2831

2932
@Value("${oauth.kakao.redirect-uri}")
@@ -35,28 +38,37 @@ public class OAuthService {
3538

3639
public BaseResponse<OAuthLoginResponse> oAuthKaKaoLoin(String code){
3740
KakaoInfoResponse kakaoInfoResponse = requestUserInfo.requestKakaoInfo(code, redirect_uri);
38-
return afterAuthorizedOauth(kakaoInfoResponse);
41+
return makeOauthResponseDependingOnExist(kakaoInfoResponse);
3942
}
4043

4144
public BaseResponse<OAuthLoginResponse> oAuthKaKaoLoinLocal(String code){
4245
KakaoInfoResponse kakaoInfoResponse = requestUserInfo.requestKakaoInfo(code, redirect_uri_client);
43-
return afterAuthorizedOauth(kakaoInfoResponse);
46+
return makeOauthResponseDependingOnExist(kakaoInfoResponse);
4447
}
4548

46-
private BaseResponse<OAuthLoginResponse> afterAuthorizedOauth(KakaoInfoResponse kakaoInfoResponse){
47-
User user = User.builder()
48-
.userName(kakaoInfoResponse.getNickname())
49-
.email(kakaoInfoResponse.getEmail())
50-
.role(Role.USER)
51-
.build();
52-
53-
User createdUser = createUser.createUser(user);
54-
AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.from(createdUser));
49+
private BaseResponse<OAuthLoginResponse> makeOauthResponseDependingOnExist(KakaoInfoResponse kakaoInfoResponse){
50+
User matchedUser = null;
51+
AuthTokens authTokens = null;
52+
try{
53+
matchedUser = getUser.getUserByEmail(kakaoInfoResponse.getEmail());
54+
authTokens = jwtProvider.createToken(JwtUserDetails.from(matchedUser));
55+
}catch(UserException e){
56+
log.error(e.getMessage());
57+
return returnNonUserResponse(kakaoInfoResponse.getEmail());
58+
}
5559

5660
return new BaseResponse<>(
5761
BaseResponseStatus.OK,
5862
BaseResponseMessage.로그인_성공했습니다.getMessage(),
59-
OAuthLoginResponse.createSuccessObjFrom(authTokens, kakaoInfoResponse.getEmail())
63+
OAuthLoginResponse.createExistUserResponse(matchedUser,authTokens)
64+
);
65+
}
66+
67+
private BaseResponse<OAuthLoginResponse> returnNonUserResponse(String email){
68+
return new BaseResponse<>(
69+
BaseResponseStatus.OK,
70+
BaseResponseMessage.존재하지_않는_유저입니다.getMessage(),
71+
OAuthLoginResponse.createNonUserResponse(email)
6072
);
6173
}
6274
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.neighbors.tohero.application.user.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.neighbors.tohero.common.enums.Role;
5+
import jakarta.validation.constraints.Email;
6+
import jakarta.validation.constraints.NotBlank;
7+
import jakarta.validation.constraints.NotNull;
8+
import org.hibernate.validator.constraints.Length;
9+
10+
public record AuthenticateUserRequest (
11+
@NotNull
12+
Role role,
13+
14+
@NotBlank
15+
@Length(min = 1, max = 5)
16+
String nickname,
17+
18+
@JsonInclude(JsonInclude.Include.NON_NULL)
19+
@Email
20+
String email
21+
){
22+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.neighbors.tohero.application.user.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.neighbors.tohero.common.enums.Role;
5+
import com.neighbors.tohero.common.jwt.AuthTokens;
6+
import com.neighbors.tohero.domain.domain.user.model.User;
7+
8+
public record AuthenticateUserResponse(
9+
AuthTokens authTokens,
10+
11+
@JsonInclude(JsonInclude.Include.NON_NULL)
12+
UserInfo userInfo
13+
) {
14+
public record UserInfo(
15+
long userId,
16+
String nickname,
17+
String email,
18+
Role role
19+
){
20+
}
21+
22+
public static AuthenticateUserResponse toUserDTO(AuthTokens authTokens, User user) {
23+
UserInfo userInfo = new UserInfo(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole());
24+
return new AuthenticateUserResponse(authTokens, userInfo);
25+
}
26+
27+
public static AuthenticateUserResponse toGuestDTO(AuthTokens authTokens) {
28+
return new AuthenticateUserResponse(authTokens, null);
29+
}
30+
}

src/main/java/com/neighbors/tohero/application/user/service/UserService.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
import com.neighbors.tohero.application.baseResponse.BaseResponse;
44
import com.neighbors.tohero.application.baseResponse.BaseResponseMessage;
55
import com.neighbors.tohero.application.baseResponse.BaseResponseStatus;
6+
import com.neighbors.tohero.application.user.dto.AuthenticateUserRequest;
7+
import com.neighbors.tohero.application.user.dto.AuthenticateUserResponse;
8+
import com.neighbors.tohero.common.enums.Role;
9+
import com.neighbors.tohero.common.jwt.AuthTokens;
10+
import com.neighbors.tohero.common.jwt.JwtProvider;
11+
import com.neighbors.tohero.common.jwt.JwtUserDetails;
12+
import com.neighbors.tohero.domain.domain.user.model.User;
13+
import com.neighbors.tohero.domain.domain.user.service.CreateUser;
614
import com.neighbors.tohero.domain.domain.user.service.UpdateUser;
715
import lombok.RequiredArgsConstructor;
816
import org.springframework.stereotype.Service;
@@ -12,14 +20,42 @@
1220
public class UserService {
1321

1422
private final UpdateUser updateUser;
23+
private final CreateUser createUser;
24+
private final JwtProvider jwtProvider;
1525

1626
public BaseResponse updateUserName(long userId, String nickname){
1727

1828
updateUser.updateUserName(userId, nickname);
19-
2029
return new BaseResponse(
2130
BaseResponseStatus.OK,
2231
BaseResponseMessage.유저_이름_변경이_완료되었습니다.getMessage()
2332
);
2433
}
34+
35+
public BaseResponse<AuthenticateUserResponse> authenticateUser(AuthenticateUserRequest authenticateUserRequest){
36+
if(authenticateUserRequest.role() == Role.USER){
37+
return returnLoginedUserToken(authenticateUserRequest);
38+
}
39+
return returnGuestUserToken(authenticateUserRequest);
40+
}
41+
42+
private BaseResponse<AuthenticateUserResponse> returnLoginedUserToken(AuthenticateUserRequest authenticateUserRequest) {
43+
User createdUser = createUser.createUser(User.toEntity(authenticateUserRequest));
44+
AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.from(createdUser));
45+
46+
return new BaseResponse(
47+
BaseResponseStatus.OK,
48+
BaseResponseMessage.유저가_성공적으로_인증되었습니다.getMessage(),
49+
AuthenticateUserResponse.toUserDTO(authTokens, createdUser)
50+
);
51+
}
52+
53+
private BaseResponse<AuthenticateUserResponse> returnGuestUserToken(AuthenticateUserRequest authenticateUserRequest) {
54+
AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.makeGuestJwtDetails(authenticateUserRequest.nickname()));
55+
return new BaseResponse(
56+
BaseResponseStatus.OK,
57+
BaseResponseMessage.GUEST_유저_토큰이_정상적으로_생성되었습니다.getMessage(),
58+
AuthenticateUserResponse.toGuestDTO(authTokens)
59+
);
60+
}
2561
}

src/main/java/com/neighbors/tohero/common/config/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public WebSecurityCustomizer webSecurityCustomizer() {
4141
"/v3/api-docs/**",
4242
"/oauth/kakao/callback",
4343
"/oauth/kakao/callback2",
44+
"/user/auth",
4445
"/auth/refreshToken",
4546
"/address",
4647
"/notice/**",

src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@ public class JwtProvider {
2929
private long REFRESH_TOKEN_EXPIRED_IN;
3030

3131
public AuthTokens createToken(JwtUserDetails jwtUserDetails) {
32-
log.info("JWT key={}", JWT_SECRET_KEY);
33-
3432
Claims claims = Jwts.claims()
35-
.setSubject(jwtUserDetails.getEmail())
36-
.setIssuer("zipkok");
33+
.setSubject(jwtUserDetails.getNickname())
34+
.setIssuer("ToHero");
3735

3836
claims.put("role", jwtUserDetails.getRole());
39-
claims.put("id", jwtUserDetails.getUserId());
37+
if(jwtUserDetails.getRole() == Role.USER) {
38+
claims.put("userId", jwtUserDetails.getUserId());
39+
claims.put("email", jwtUserDetails.getEmail());
40+
}
4041

4142
Date now = new Date();
4243
Date accessTokenExpiredAt = new Date(now.getTime() + JWT_EXPIRED_IN);
@@ -118,9 +119,10 @@ public JwtUserDetails getJwtUserDetails(String token) {
118119
Claims claims = getBody(token);
119120

120121
return JwtUserDetails.builder()
121-
.email(String.valueOf(claims.getSubject()))
122-
.userId(Long.valueOf(claims.get("id").toString()))
122+
.nickname(String.valueOf(claims.getSubject()))
123123
.role(Role.valueOf(claims.get("role").toString()))
124+
.email(claims.get("email").toString())
125+
.userId(Long.parseLong(claims.get("userId").toString()))
124126
.build();
125127

126128
}

0 commit comments

Comments
 (0)