Skip to content

Commit

Permalink
Merge pull request #68 from onetime-with-members/feature/#67/register…
Browse files Browse the repository at this point in the history
…-token

[feat] : 레지스터 토큰 유효기간을 지정한다
  • Loading branch information
bbbang105 authored Oct 4, 2024
2 parents 9cf2b90 + 512bf65 commit 9bcba4f
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ public class OAuthLoginSuccessHandler extends SimpleUrlAuthenticationSuccessHand
@Value("${jwt.refresh-token.expiration-time}")
private long REFRESH_TOKEN_EXPIRATION_TIME;

@Value("${jwt.register-token.expiration-time}")
private long REGISTER_TOKEN_EXPIRATION_TIME;

private final JwtUtil jwtUtil;
private final UserRepository userRepository;
private final RefreshTokenRepository refreshTokenRepository;
Expand Down Expand Up @@ -96,7 +99,7 @@ private void handleAuthentication(HttpServletRequest request, HttpServletRespons
// 신규 유저 처리
private void handleNewUser(HttpServletRequest request, HttpServletResponse response, String provider, String providerId, String name, String email) throws IOException {
log.info("신규 유저입니다.");
String registerToken = jwtUtil.generateRegisterToken(provider, providerId, name, email, ACCESS_TOKEN_EXPIRATION_TIME);
String registerToken = jwtUtil.generateRegisterToken(provider, providerId, name, email, REGISTER_TOKEN_EXPIRATION_TIME);
String redirectUri = String.format(REGISTER_TOKEN_REDIRECT_URI, registerToken, URLEncoder.encode(name, StandardCharsets.UTF_8));
getRedirectStrategy().sendRedirect(request, response, redirectUri);
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/side/onetime/exception/TokenErrorResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
public enum TokenErrorResult implements BaseErrorCode {
_INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "401", "유효하지 않은 토큰입니다."),
_INVALID_REFRESH_TOKEN(HttpStatus.UNAUTHORIZED, "401", "유효하지 않은 리프레쉬 토큰입니다."),
_EXPIRED_TOKEN(HttpStatus.UNAUTHORIZED, "401", "만료된 토큰입니다."),
_NOT_FOUND_REFRESH_TOKEN(HttpStatus.NOT_FOUND, "404", "리프레쉬 토큰을 찾을 수 없습니다.")
;

Expand Down
5 changes: 3 additions & 2 deletions src/main/java/side/onetime/service/TokenService.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,14 @@ public class TokenService {
// 액세스 & 리프레쉬 토큰 재발행 메서드
public TokenDto.ReissueTokenResponse reissueToken(TokenDto.ReissueTokenRequest reissueTokenRequest) {
String refreshToken = reissueTokenRequest.getRefreshToken();
jwtUtil.validateTokenExpiration(refreshToken);
Long userId = jwtUtil.getUserIdFromToken(refreshToken);
RefreshToken existRefreshToken = refreshTokenRepository.findByUserId(userId)
.orElseThrow(() -> new TokenException(TokenErrorResult._NOT_FOUND_REFRESH_TOKEN));
String newAccessToken;

if (!existRefreshToken.getRefreshToken().equals(refreshToken) || jwtUtil.isTokenExpired(refreshToken)) {
// 리프레쉬 토큰이 다르거나, 만료된 경우
if (!existRefreshToken.getRefreshToken().equals(refreshToken)) {
// 리프레쉬 토큰이 다른 경우
throw new TokenException(TokenErrorResult._INVALID_REFRESH_TOKEN); // 401 에러를 던져 재로그인을 요청
} else {
// 액세스 토큰 재발급
Expand Down
1 change: 1 addition & 0 deletions src/main/java/side/onetime/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public class UserService {
public UserDto.OnboardUserResponse onboardUser(UserDto.OnboardUserRequest onboardUserRequest) {
// 레지스터 토큰을 이용하여 사용자 정보 추출
String registerToken = onboardUserRequest.getRegisterToken();
jwtUtil.validateTokenExpiration(registerToken);
String provider = jwtUtil.getProviderFromToken(registerToken);
String providerId = jwtUtil.getProviderIdFromToken(registerToken);
String name = jwtUtil.getNameFromToken(registerToken);
Expand Down
23 changes: 11 additions & 12 deletions src/main/java/side/onetime/util/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public Long getUserIdFromToken(String token) {
return Long.parseLong(userId);
} catch (JwtException | IllegalArgumentException e) {
// 토큰이 유효하지 않은 경우
log.warn("토큰에서 userId를 반환하던 도중 에러가 발생했습니다.");
log.error("토큰에서 userId를 반환하던 도중 에러가 발생했습니다.");
throw new TokenException(TokenErrorResult._INVALID_TOKEN);
}
}
Expand All @@ -114,7 +114,7 @@ public String getProviderFromToken(String token) {
return userId;
} catch (JwtException | IllegalArgumentException e) {
// 토큰이 유효하지 않은 경우
log.warn("토큰에서 provider를 반환하는 도중 에러가 발생했습니다.");
log.error("토큰에서 provider를 반환하는 도중 에러가 발생했습니다.");
throw new TokenException(TokenErrorResult._INVALID_TOKEN);
}
}
Expand All @@ -132,12 +132,12 @@ public String getProviderIdFromToken(String token) {
return providerId;
} catch (JwtException | IllegalArgumentException e) {
// 토큰이 유효하지 않은 경우
log.warn("토큰에서 providerId를 반환하는 도중 에러가 발생했습니다.");
log.error("토큰에서 providerId를 반환하는 도중 에러가 발생했습니다.");
throw new TokenException(TokenErrorResult._INVALID_TOKEN);
}
}

// 토큰에서 name을 반환하는 메서드
// 토큰에서 이름을 반환하는 메서드
public String getNameFromToken(String token) {
try {
String name = Jwts.parser()
Expand All @@ -150,12 +150,12 @@ public String getNameFromToken(String token) {
return name;
} catch (JwtException | IllegalArgumentException e) {
// 토큰이 유효하지 않은 경우
log.warn("토큰에서 이름을 반환하는 도중 에러가 발생했습니다.");
log.error("토큰에서 이름을 반환하는 도중 에러가 발생했습니다.");
throw new TokenException(TokenErrorResult._INVALID_TOKEN);
}
}

// 토큰에서 name을 반환하는 메서드
// 토큰에서 이메일을 반환하는 메서드
public String getEmailFromToken(String token) {
try {
String email = Jwts.parser()
Expand All @@ -168,26 +168,25 @@ public String getEmailFromToken(String token) {
return email;
} catch (JwtException | IllegalArgumentException e) {
// 토큰이 유효하지 않은 경우
log.warn("토큰에서 이메일을 반환하는 도중 에러가 발생했습니다.");
log.error("토큰에서 이메일을 반환하는 도중 에러가 발생했습니다.");
throw new TokenException(TokenErrorResult._INVALID_TOKEN);
}
}

// Jwt 토큰의 유효기간을 확인하는 메서드
public boolean isTokenExpired(String token) {
public void validateTokenExpiration(String token) {
try {
log.info("토큰의 유효기간을 확인합니다.");
Date expirationDate = Jwts.parser()
.verifyWith(this.getSigningKey())
.build()
.parseSignedClaims(token)
.getPayload()
.getExpiration();
log.info("토큰의 유효기간을 확인합니다.");
return expirationDate.before(new Date());
} catch (JwtException | IllegalArgumentException e) {
// 토큰이 유효하지 않은 경우
log.warn("유효기간 확인 도중 에러가 발생했습니다.");
throw new TokenException(TokenErrorResult._INVALID_TOKEN);
log.error("만료된 토큰입니다.");
throw new TokenException(TokenErrorResult._EXPIRED_TOKEN);
}
}
}
4 changes: 3 additions & 1 deletion src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,6 @@ jwt:
access-token:
expiration-time: ${ACCESS_TOKEN_EXPIRATION_TIME}
refresh-token:
expiration-time: ${REFRESH_TOKEN_EXPIRATION_TIME}
expiration-time: ${REFRESH_TOKEN_EXPIRATION_TIME}
register-token:
expiration-time: ${REGISTER_TOKEN_EXPIRATION_TIME}

0 comments on commit 9bcba4f

Please sign in to comment.