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 @@ -16,6 +16,10 @@ public enum BaseResponseMessage {
유저_이름_변경이_완료되었습니다("유저 이름 변경이 완료되었습니다"),
존재하지_않는_유저입니다("존재하지 않는 유저입니다"),
유저_이름의_길이는_1부터_5까지만_가능합니다("유저 이름의 길이는 1부터 5까지만 가능합니다"),
ROLE_필드는_필수입력입니다("ROLE 필드는 필수입력입니다"),
이메일_형식이_올바르지_못합니다("이메일 형식이 올바르지 못합니다"),
유저가_성공적으로_인증되었습니다("유저가 성공적으로 인증되었습니다"),
GUEST_유저_토큰이_정상적으로_생성되었습니다("GUEST 유저 토큰이 정상적으로 생성되었습니다"),

//jwt error message
JWT_토큰_오류입니다("JWT 토큰 오류입니다"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.neighbors.tohero.application.letter.dto;

public record CreateLetterRequest (

){
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.neighbors.tohero.application.letter.service;

import com.neighbors.tohero.application.baseResponse.BaseResponse;
import com.neighbors.tohero.application.letter.dto.CreateLetterRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class LetterService {

public BaseResponse createLetter(CreateLetterRequest createLetterRequest) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,38 @@
package com.neighbors.tohero.application.login.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.neighbors.tohero.common.enums.Role;
import com.neighbors.tohero.common.jwt.AuthTokens;
import com.neighbors.tohero.domain.domain.user.model.User;
import lombok.Builder;
import lombok.Data;

@Builder
@Data
public class OAuthLoginResponse {
private boolean isMember;
public record OAuthLoginResponse (
boolean isMember,

@JsonInclude(JsonInclude.Include.NON_NULL)
private AuthTokens authTokens;
@JsonInclude(JsonInclude.Include.NON_NULL)
UserInfo userInfo,

@JsonInclude(JsonInclude.Include.NON_NULL)
private String email;
@JsonInclude(JsonInclude.Include.NON_NULL)
AuthTokens authTokens,

public static OAuthLoginResponse createSuccessObjFrom(AuthTokens authTokens, String email) {
return OAuthLoginResponse.builder()
.authTokens(authTokens)
.email(email)
.isMember(true)
.build();
@JsonInclude(JsonInclude.Include.NON_NULL)
String email
){
public record UserInfo(
long userId,
String nickname,
String email,
Role role
){
}

public static OAuthLoginResponse createNonUserResponse(String email){
return new OAuthLoginResponse(false, null, null, email);
}

public static OAuthLoginResponse createExistUserResponse(User user, AuthTokens authTokens){
UserInfo userInfo = new UserInfo(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole());
return new OAuthLoginResponse(true, userInfo, authTokens,null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@
import com.neighbors.tohero.application.baseResponse.BaseResponse;
import com.neighbors.tohero.application.baseResponse.BaseResponseMessage;
import com.neighbors.tohero.application.baseResponse.BaseResponseStatus;
import com.neighbors.tohero.common.enums.Role;
import com.neighbors.tohero.common.exception.user.UserException;
import com.neighbors.tohero.common.jwt.AuthTokens;
import com.neighbors.tohero.common.jwt.JwtProvider;
import com.neighbors.tohero.common.jwt.JwtUserDetails;
import com.neighbors.tohero.domain.domain.login.model.User;
import com.neighbors.tohero.domain.domain.login.service.CreateUser;
import com.neighbors.tohero.domain.domain.user.model.User;
import com.neighbors.tohero.domain.domain.user.service.CreateUser;
import com.neighbors.tohero.domain.domain.login.service.oauth.kakao.RequestKakaoInfo;
import com.neighbors.tohero.domain.domain.user.service.GetUser;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Slf4j
@Service
@RequiredArgsConstructor
public class OAuthService {

private final RequestKakaoInfo requestUserInfo;
private final CreateUser createUser;
private final GetUser getUser;
private final JwtProvider jwtProvider;

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

public BaseResponse<OAuthLoginResponse> oAuthKaKaoLoin(String code){
KakaoInfoResponse kakaoInfoResponse = requestUserInfo.requestKakaoInfo(code, redirect_uri);
return afterAuthorizedOauth(kakaoInfoResponse);
return makeOauthResponseDependingOnExist(kakaoInfoResponse);
}

public BaseResponse<OAuthLoginResponse> oAuthKaKaoLoinLocal(String code){
KakaoInfoResponse kakaoInfoResponse = requestUserInfo.requestKakaoInfo(code, redirect_uri_client);
return afterAuthorizedOauth(kakaoInfoResponse);
return makeOauthResponseDependingOnExist(kakaoInfoResponse);
}

private BaseResponse<OAuthLoginResponse> afterAuthorizedOauth(KakaoInfoResponse kakaoInfoResponse){
User user = User.builder()
.userName(kakaoInfoResponse.getNickname())
.email(kakaoInfoResponse.getEmail())
.role(Role.USER)
.build();

User createdUser = createUser.createUser(user);
AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.from(createdUser));
private BaseResponse<OAuthLoginResponse> makeOauthResponseDependingOnExist(KakaoInfoResponse kakaoInfoResponse){
User matchedUser = null;
AuthTokens authTokens = null;
try{
matchedUser = getUser.getUserByEmail(kakaoInfoResponse.getEmail());
authTokens = jwtProvider.createToken(JwtUserDetails.from(matchedUser));
}catch(UserException e){
log.error(e.getMessage());
return returnNonUserResponse(kakaoInfoResponse.getEmail());
}

return new BaseResponse<>(
BaseResponseStatus.OK,
BaseResponseMessage.로그인_성공했습니다.getMessage(),
OAuthLoginResponse.createSuccessObjFrom(authTokens, kakaoInfoResponse.getEmail())
OAuthLoginResponse.createExistUserResponse(matchedUser,authTokens)
);
}

private BaseResponse<OAuthLoginResponse> returnNonUserResponse(String email){
return new BaseResponse<>(
BaseResponseStatus.OK,
BaseResponseMessage.존재하지_않는_유저입니다.getMessage(),
OAuthLoginResponse.createNonUserResponse(email)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.neighbors.tohero.application.user.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.neighbors.tohero.common.enums.Role;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;

public record AuthenticateUserRequest (
@NotNull
Role role,

@NotBlank
@Length(min = 1, max = 5)
String nickname,

@JsonInclude(JsonInclude.Include.NON_NULL)
@Email
String email
){
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.neighbors.tohero.application.user.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.neighbors.tohero.common.enums.Role;
import com.neighbors.tohero.common.jwt.AuthTokens;
import com.neighbors.tohero.domain.domain.user.model.User;

public record AuthenticateUserResponse(
AuthTokens authTokens,

@JsonInclude(JsonInclude.Include.NON_NULL)
UserInfo userInfo
) {
public record UserInfo(
long userId,
String nickname,
String email,
Role role
){
}

public static AuthenticateUserResponse toUserDTO(AuthTokens authTokens, User user) {
UserInfo userInfo = new UserInfo(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole());
return new AuthenticateUserResponse(authTokens, userInfo);
}

public static AuthenticateUserResponse toGuestDTO(AuthTokens authTokens) {
return new AuthenticateUserResponse(authTokens, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
import com.neighbors.tohero.application.baseResponse.BaseResponse;
import com.neighbors.tohero.application.baseResponse.BaseResponseMessage;
import com.neighbors.tohero.application.baseResponse.BaseResponseStatus;
import com.neighbors.tohero.application.user.dto.AuthenticateUserRequest;
import com.neighbors.tohero.application.user.dto.AuthenticateUserResponse;
import com.neighbors.tohero.common.enums.Role;
import com.neighbors.tohero.common.jwt.AuthTokens;
import com.neighbors.tohero.common.jwt.JwtProvider;
import com.neighbors.tohero.common.jwt.JwtUserDetails;
import com.neighbors.tohero.domain.domain.user.model.User;
import com.neighbors.tohero.domain.domain.user.service.CreateUser;
import com.neighbors.tohero.domain.domain.user.service.UpdateUser;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -12,14 +20,42 @@
public class UserService {

private final UpdateUser updateUser;
private final CreateUser createUser;
private final JwtProvider jwtProvider;

public BaseResponse updateUserName(long userId, String nickname){

updateUser.updateUserName(userId, nickname);

return new BaseResponse(
BaseResponseStatus.OK,
BaseResponseMessage.유저_이름_변경이_완료되었습니다.getMessage()
);
}

public BaseResponse<AuthenticateUserResponse> authenticateUser(AuthenticateUserRequest authenticateUserRequest){
if(authenticateUserRequest.role() == Role.USER){
return returnLoginedUserToken(authenticateUserRequest);
}
return returnGuestUserToken(authenticateUserRequest);
}

private BaseResponse<AuthenticateUserResponse> returnLoginedUserToken(AuthenticateUserRequest authenticateUserRequest) {
User createdUser = createUser.createUser(User.toEntity(authenticateUserRequest));
AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.from(createdUser));

return new BaseResponse(
BaseResponseStatus.OK,
BaseResponseMessage.유저가_성공적으로_인증되었습니다.getMessage(),
AuthenticateUserResponse.toUserDTO(authTokens, createdUser)
);
}

private BaseResponse<AuthenticateUserResponse> returnGuestUserToken(AuthenticateUserRequest authenticateUserRequest) {
AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.makeGuestJwtDetails(authenticateUserRequest.nickname()));
return new BaseResponse(
BaseResponseStatus.OK,
BaseResponseMessage.GUEST_유저_토큰이_정상적으로_생성되었습니다.getMessage(),
AuthenticateUserResponse.toGuestDTO(authTokens)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public WebSecurityCustomizer webSecurityCustomizer() {
"/v3/api-docs/**",
"/oauth/kakao/callback",
"/oauth/kakao/callback2",
"/user/auth",
"/auth/refreshToken",
"/address",
"/notice/**",
Expand Down
16 changes: 9 additions & 7 deletions src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,15 @@ public class JwtProvider {
private long REFRESH_TOKEN_EXPIRED_IN;

public AuthTokens createToken(JwtUserDetails jwtUserDetails) {
log.info("JWT key={}", JWT_SECRET_KEY);

Claims claims = Jwts.claims()
.setSubject(jwtUserDetails.getEmail())
.setIssuer("zipkok");
.setSubject(jwtUserDetails.getNickname())
.setIssuer("ToHero");

claims.put("role", jwtUserDetails.getRole());
claims.put("id", jwtUserDetails.getUserId());
if(jwtUserDetails.getRole() == Role.USER) {
claims.put("userId", jwtUserDetails.getUserId());
claims.put("email", jwtUserDetails.getEmail());
}

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

return JwtUserDetails.builder()
.email(String.valueOf(claims.getSubject()))
.userId(Long.valueOf(claims.get("id").toString()))
.nickname(String.valueOf(claims.getSubject()))
.role(Role.valueOf(claims.get("role").toString()))
.email(claims.get("email").toString())
.userId(Long.parseLong(claims.get("userId").toString()))
.build();

}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.neighbors.tohero.common.jwt;

import com.neighbors.tohero.common.enums.Role;
import com.neighbors.tohero.domain.domain.login.model.User;
import com.neighbors.tohero.domain.domain.user.model.User;
import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
Expand All @@ -11,20 +11,23 @@
@Builder
public class JwtUserDetails {
private final String email;
private final Long userId;
private final String nickname;
private final Role role;
private final long userId;

public static JwtUserDetails from(User user) {
return JwtUserDetails.builder()
.email(user.getEmail())
.userId(user.getUserId())
.nickname(user.getUserName())
.role(user.getRole())
.userId(user.getUserId())
.build();
}

public static JwtUserDetails makeGuestJwtDetails() {
public static JwtUserDetails makeGuestJwtDetails(String nickname) {
return JwtUserDetails.builder()
.role(Role.GUEST)
.nickname(nickname)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ private Optional<UserAuthentication> makeAuthentication(HttpServletRequest reque
authentication = UserAuthentication.from(jwtProvider.getJwtUserDetails(token));
} else if (isRequestAvailableToGuest(request)) {
log.info("[AuthenticationUtil.makeAuthentication : Guest 권한 부여]");
authentication = UserAuthentication.makeGuestAuthentication();
// authentication = UserAuthentication.makeGuestAuthentication();
}

if(authentication != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public static UserAuthentication from(JwtUserDetails jwtUserDetails) {
return new UserAuthentication(jwtUserDetails, null, jwtUserDetails.getRole().getAuthority());
}

public static UserAuthentication makeGuestAuthentication() {
return new UserAuthentication(JwtUserDetails.makeGuestJwtDetails(), null, Role.GUEST.getAuthority());
}
// public static UserAuthentication makeGuestAuthentication() {
// return new UserAuthentication(JwtUserDetails.makeGuestJwtDetails(), null, Role.GUEST.getAuthority());
// }

}
Loading
Loading