Skip to content

Commit ea1ff89

Browse files
authored
Merge pull request #54 from TeamPINGLE/fix/51
[fix] refreshToken 설계 오류
2 parents c0f1f06 + 521f202 commit ea1ff89

File tree

6 files changed

+33
-19
lines changed

6 files changed

+33
-19
lines changed

src/main/java/org/pingle/pingleserver/controller/AuthController.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.pingle.pingleserver.constant.Constants;
88
import org.pingle.pingleserver.dto.common.ApiResponse;
99
import org.pingle.pingleserver.dto.request.LoginRequest;
10-
import org.pingle.pingleserver.dto.request.ReissueRequest;
1110
import org.pingle.pingleserver.dto.response.JwtTokenResponse;
1211
import org.pingle.pingleserver.dto.type.SuccessMessage;
1312
import org.pingle.pingleserver.service.AuthService;
@@ -29,8 +28,8 @@ public ApiResponse<JwtTokenResponse> login(
2928

3029
@PostMapping("/reissue")
3130
public ApiResponse<JwtTokenResponse> reissue(
32-
@Valid @RequestBody ReissueRequest request){
33-
return ApiResponse.success(SuccessMessage.OK, authService.reissue(request));
31+
@NotNull @RequestHeader(Constants.AUTHORIZATION_HEADER) String refreshToken){
32+
return ApiResponse.success(SuccessMessage.OK, authService.reissue(refreshToken));
3433
}
3534

3635
@PostMapping("/logout")

src/main/java/org/pingle/pingleserver/controller/TestController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
import org.pingle.pingleserver.domain.User;
77
import org.pingle.pingleserver.dto.response.JwtTokenResponse;
88
import org.pingle.pingleserver.exception.CustomException;
9-
import org.pingle.pingleserver.dto.response.JwtTokenResponse;
109
import org.pingle.pingleserver.dto.type.ErrorMessage;
1110
import org.pingle.pingleserver.repository.UserRepository;
1211
import org.pingle.pingleserver.utils.JwtUtil;
1312
import org.springframework.http.ResponseEntity;
13+
import org.springframework.transaction.annotation.Transactional;
1414
import org.springframework.web.bind.annotation.GetMapping;
1515
import org.springframework.web.bind.annotation.PathVariable;
1616
import org.springframework.web.bind.annotation.RequestMapping;
@@ -25,6 +25,7 @@ public class TestController {
2525
private final JwtUtil jwtUtil;
2626
private final UserRepository userRepository;
2727

28+
@Transactional
2829
@GetMapping("/token/{userId}")
2930
public JwtTokenResponse testToken(@PathVariable Long userId) {
3031
User user = userRepository.findById(userId)

src/main/java/org/pingle/pingleserver/dto/request/ReissueRequest.java

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/main/java/org/pingle/pingleserver/dto/type/ErrorMessage.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ public enum ErrorMessage {
1313
EXPIRED_APPLE_IDENTITY_TOKEN(HttpStatus.BAD_REQUEST, "만료된 Apple Identity Token입니다."),
1414
CREATE_PUBLIC_KEY_EXCEPTION(HttpStatus.BAD_REQUEST, "Apple Public verify에 실패했습니다."),
1515
// JWT Error
16-
INVALID_JWT_TOKEN(HttpStatus.UNAUTHORIZED, "유효하지 않은 JWT 토큰입니다."),
17-
EXPIRED_JWT_TOKEN(HttpStatus.UNAUTHORIZED, "만료된 JWT 토큰입니다."),
18-
UNSUPPORTED_JWT_TOKEN(HttpStatus.UNAUTHORIZED, "지원하지 않는 JWT 토큰입니다."),
19-
JWT_TOKEN_IS_EMPTY(HttpStatus.UNAUTHORIZED, "JWT 토큰이 비어있습니다."),
16+
INVALID_JWT_TOKEN(HttpStatus.UNAUTHORIZED, "유효하지 않은 토큰입니다."),
17+
EXPIRED_JWT_TOKEN(HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."),
18+
UNSUPPORTED_JWT_TOKEN(HttpStatus.UNAUTHORIZED, "지원하지 않는 토큰입니다."),
19+
JWT_TOKEN_IS_EMPTY(HttpStatus.UNAUTHORIZED, "토큰이 비어있습니다."),
20+
INVALID_TOKEN_TYPE(HttpStatus.UNAUTHORIZED, "유효하지 않은 토큰 타입입니다."),
2021
// Invalid Argument Error 400
2122
BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."),
2223
ALREADY_REGISTERED_USER(HttpStatus.BAD_REQUEST, "이미 가입된 사용자입니다."),

src/main/java/org/pingle/pingleserver/security/filter/JwtAuthenticationFilter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import lombok.RequiredArgsConstructor;
1010
import lombok.extern.slf4j.Slf4j;
1111
import org.pingle.pingleserver.constant.Constants;
12+
import org.pingle.pingleserver.dto.type.ErrorMessage;
13+
import org.pingle.pingleserver.exception.CustomException;
1214
import org.pingle.pingleserver.security.info.UserAuthentication;
1315
import org.pingle.pingleserver.utils.JwtUtil;
1416
import org.springframework.security.core.context.SecurityContextHolder;
@@ -33,7 +35,11 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull Ht
3335

3436
if (StringUtils.hasText(token)) {
3537
Claims claims = jwtUtil.getTokenBody(token);
36-
Long userId = claims.get("uid", Long.class);
38+
Long userId = claims.get(Constants.USER_ID_CLAIM_NAME, Long.class);
39+
if (claims.get(Constants.USER_ROLE_CLAIM_NAME, String.class) == null) {
40+
if (!request.getRequestURI().equals("/v1/auth/reissue"))
41+
throw new CustomException(ErrorMessage.INVALID_TOKEN_TYPE);
42+
}
3743
UserAuthentication authentication = new UserAuthentication(userId, null, null);
3844
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
3945
SecurityContextHolder.getContext().setAuthentication(authentication);

src/main/java/org/pingle/pingleserver/service/AuthService.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package org.pingle.pingleserver.service;
22

3+
import io.jsonwebtoken.Claims;
34
import lombok.RequiredArgsConstructor;
5+
import org.pingle.pingleserver.constant.Constants;
46
import org.pingle.pingleserver.domain.User;
57
import org.pingle.pingleserver.domain.enums.Provider;
68
import org.pingle.pingleserver.domain.enums.URole;
7-
import org.pingle.pingleserver.dto.request.ReissueRequest;
89
import org.pingle.pingleserver.exception.CustomException;
910
import org.pingle.pingleserver.oauth.dto.SocialInfoDto;
1011
import org.pingle.pingleserver.dto.request.LoginRequest;
@@ -35,9 +36,13 @@ public JwtTokenResponse login(String providerToken, LoginRequest request) {
3536
}
3637

3738
@Transactional
38-
public JwtTokenResponse reissue(ReissueRequest request) {
39-
jwtUtil.getTokenBody(request.refreshToken());
40-
User user = userRepository.findByRefreshTokenAndIsDeleted(request.refreshToken(), false)
39+
public JwtTokenResponse reissue(String token) {
40+
String refreshToken = getToken(token);
41+
Claims claims = jwtUtil.getTokenBody(refreshToken);
42+
if (claims.get(Constants.USER_ROLE_CLAIM_NAME, String.class) != null) {
43+
throw new CustomException(ErrorMessage.INVALID_TOKEN_TYPE);
44+
}
45+
User user = userRepository.findByRefreshTokenAndIsDeleted(refreshToken, false)
4146
.orElseThrow(() -> new CustomException(ErrorMessage.USER_NOT_FOUND));
4247
return generateTokensWithUpdateRefreshToken(user);
4348
}
@@ -82,4 +87,12 @@ private JwtTokenResponse generateTokensWithUpdateRefreshToken(User user){
8287
return jwtTokenResponse;
8388
}
8489

90+
private String getToken(String token){
91+
if (token.startsWith(Constants.BEARER_PREFIX)){
92+
return token.substring(Constants.BEARER_PREFIX.length());
93+
} else {
94+
return token;
95+
}
96+
}
97+
8598
}

0 commit comments

Comments
 (0)