From f066e5cd16073a6f94625997adf5b22782d899cf Mon Sep 17 00:00:00 2001 From: wingyou Date: Tue, 21 Jan 2025 23:40:55 +0900 Subject: [PATCH] =?UTF-8?q?fix(auth):=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=EC=8B=9C=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=9E=85=EB=A0=A5=20=EC=83=81=ED=83=9C=20=EB=B0=8F?= =?UTF-8?q?=20=EB=A7=81=ED=81=AC=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/goolbitg/api/security/AuthUtil.java | 9 ---- .../goolbitg/api/service/UserServiceImpl.java | 46 +++++++++++++++++-- src/main/resources/api/openapi.yaml | 32 ++----------- 3 files changed, 45 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/goolbitg/api/security/AuthUtil.java b/src/main/java/com/goolbitg/api/security/AuthUtil.java index f30a96d..6fb2827 100644 --- a/src/main/java/com/goolbitg/api/security/AuthUtil.java +++ b/src/main/java/com/goolbitg/api/security/AuthUtil.java @@ -24,13 +24,4 @@ public static String getLoginUserId() { } return id; } - - public static UserDetails createUserDetails(String userId) { - UserDetails details = org.springframework.security.core.userdetails.User - .withUsername(userId) - .password("") - .authorities(List.of()) - .build(); - return details; - } } diff --git a/src/main/java/com/goolbitg/api/service/UserServiceImpl.java b/src/main/java/com/goolbitg/api/service/UserServiceImpl.java index e1058dc..e168ed7 100644 --- a/src/main/java/com/goolbitg/api/service/UserServiceImpl.java +++ b/src/main/java/com/goolbitg/api/service/UserServiceImpl.java @@ -1,5 +1,8 @@ package com.goolbitg.api.service; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; + import java.math.BigInteger; import java.security.SecureRandom; import java.time.LocalDate; @@ -7,6 +10,8 @@ import java.util.Random; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.Link; +import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.oauth2.jwt.JwtDecoder; @@ -14,6 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.goolbitg.api.controller.UserController; import com.goolbitg.api.entity.User; import com.goolbitg.api.entity.UserStats; import com.goolbitg.api.entity.UserSurvey; @@ -106,18 +112,49 @@ public LoginResponseDto login(AuthRequestDto request) { throw UserException.userNotExist(jwt.getSubject()); } User user = result.get(); + UserSurvey survey = userSurveyRepository.findById(user.getId()) + .orElseThrow(); - UserDetails details = AuthUtil.createUserDetails(user.getId()); - - String accessToken = jwtManager.create(details); + String accessToken = jwtManager.create(user.getId()); String refreshToken = createRefreshToken(user.getId()); LoginResponseDto dto = new LoginResponseDto(); dto.setAccessToken(accessToken); dto.setRefreshToken(refreshToken); + + Link nextLink = getNextRegisterLink(user, survey); + dto.setRegisterComplete(nextLink == null); + if (nextLink != null) + dto.add(nextLink); + return dto; } + private Link getNextRegisterLink(User user, UserSurvey survey) { + WebMvcLinkBuilder builder = null; + try { + if (user.getNickname() == null) + builder = linkTo(methodOn(UserController.class).postUserInfo(null)); + else if (survey.getCheck1() == null) + builder = linkTo(methodOn(UserController.class).postUserInfo(null)); + else if (survey.getAvgIncomePerMonth() == null) + builder = linkTo(methodOn(UserController.class).postUserInfo(null)); + } catch (Exception e) { + log.error("getNextRegisterLink() falied."); + } + + if (builder != null) + return builder.withRel("next").withType("POST"); + + return null; + } + + private Boolean validateRegisterComplete(User user, UserSurvey survey) { + return user.getNickname() != null && + survey.getCheck1() != null && + survey.getAvgIncomePerMonth() != null; + } + @Override @Transactional public void register(AuthRequestDto request) { @@ -157,8 +194,7 @@ public AuthResponseDto getAccessToken(TokenRefreshRequestDto request) { throw AuthException.tokenExpired(refreshToken); } String userId = result.get(); - UserDetails details = AuthUtil.createUserDetails(userId); - String accessToken = jwtManager.create(details); + String accessToken = jwtManager.create(userId); AuthResponseDto dto = new AuthResponseDto(); dto.setAccessToken(accessToken); diff --git a/src/main/resources/api/openapi.yaml b/src/main/resources/api/openapi.yaml index efddd9f..c0736ba 100644 --- a/src/main/resources/api/openapi.yaml +++ b/src/main/resources/api/openapi.yaml @@ -1800,8 +1800,6 @@ components: registerComplete: type: boolean description: 정보등록 완료 여부 - nextLinkDto: - $ref: '#/components/schemas/LinkDto' required: - registerComplete UserInfoDto: @@ -1882,28 +1880,6 @@ components: properties: duplicated: type: boolean - LinkDto: - type: object - properties: - required: - type: boolean - description: 필수 여부 - method: - type: string - enum: - - get - - post - - put - - delete - description: 요청 메소드 - url: - type: string - format: uri - description: 요청 주소 - example: - required: true - method: post - url: 'http://localhost:8080/api/v1/users/me/info' examples: PrivateChallenge: value: @@ -2022,13 +1998,13 @@ components: registerComplete: true LoginResponse_InProgress: value: + _links: + next: + href: "http://localhost:8080/v1/users/me/info" + type: "POST" accessToken: token refreshToken: token registerComplete: false - nextLinkDto: - required: true - method: post - url: http://localhost:8080/api/v1/users/me/info ChallengeGroup_Form_Normal: value: ownerId: id0001