Skip to content

Commit

Permalink
✨ Feat: 액세스 토큰 및 리프레쉬 토큰 검증 및 재발급 API
Browse files Browse the repository at this point in the history
  • Loading branch information
HyoBN committed Jan 23, 2024
1 parent 0e74b7c commit 8698bc5
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 8 deletions.
7 changes: 5 additions & 2 deletions src/main/java/cmc/peerna/jwt/JwtProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class JwtProvider {
private Key secretKey;

// 만료시간 : 5Hour, 추후 수정
private final long accessTokenValidityInMilliseconds = 1000L * 60 * 60 * 5;
private final long accessTokenValidityInMilliseconds;


// private final CustomUserDetailsService userDetailsService;
Expand All @@ -43,8 +43,11 @@ protected void init() {
}

public JwtProvider(
@Value("${jwt.secret.key}") String secret){
@Value("${jwt.secret.key}") String secret,
@Value("${jwt.access-token-validity-in-seconds}000") long accessTokenValidityInMilliseconds){
this.secret = secret;
this.accessTokenValidityInMilliseconds = accessTokenValidityInMilliseconds;

}

public String createToken(Long memberId, Collection<? extends GrantedAuthority> authorities) {
Expand Down
16 changes: 11 additions & 5 deletions src/main/java/cmc/peerna/redis/service/RedisServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -28,9 +29,14 @@ public class RedisServiceImpl implements RedisService{
Logger logger = LoggerFactory.getLogger(RedisService.class);

private final MemberRepository memberRepository;

private final RefreshTokenRepository refreshTokenRepository;

@Value("${jwt.access-token-validity-in-seconds}000")
private long accessTokenValidityInMilliseconds;

@Value("${jwt.refresh-token-validity-in-seconds}000")
private long refreshTokenValidityInMilliseconds;

@Override
@Transactional
public RefreshToken generateRefreshToken(String socialId, SocialType socialType) {
Expand All @@ -45,7 +51,7 @@ public RefreshToken generateRefreshToken(String socialId, SocialType socialType)

LocalDateTime currentTime = LocalDateTime.now();

LocalDateTime expireTime = currentTime.plus(1000, ChronoUnit.MINUTES);
LocalDateTime expireTime = currentTime.plus(refreshTokenValidityInMilliseconds, ChronoUnit.MILLIS);

return refreshTokenRepository.save(
RefreshToken.builder()
Expand All @@ -57,6 +63,7 @@ public RefreshToken generateRefreshToken(String socialId, SocialType socialType)

@Override
public RefreshToken reGenerateRefreshToken(MemberRequestDto.ReissueDTO request) {
logger.info("전달받은 리프레쉬 토큰 : " + request.getRefreshToken());
if (request.getRefreshToken() == null)
throw new MemberException(ResponseStatus.INVALID_TOKEN_EXCEPTION);
RefreshToken findRefreshToken =
Expand All @@ -67,8 +74,7 @@ public RefreshToken reGenerateRefreshToken(MemberRequestDto.ReissueDTO request)
LocalDateTime expireTime = findRefreshToken.getExpireTime();
LocalDateTime current = LocalDateTime.now();

// 테스트용, 실제로는 현재 시간 + accessToken 만료 시간
LocalDateTime expireDeadLine = current.plusSeconds(20);
LocalDateTime expireDeadLine = current.plusSeconds(accessTokenValidityInMilliseconds);

Member member =
memberRepository
Expand All @@ -85,7 +91,7 @@ public RefreshToken reGenerateRefreshToken(MemberRequestDto.ReissueDTO request)
logger.info("기존 리프레시 토큰 발급");
return findRefreshToken;
} else {
logger.info("accessToken보다 먼저 만료될 예정인 리프레시 토큰 발견");
logger.info("accessToken보다 먼저 만료될 예정인 refresh 토큰 발견");
deleteRefreshToken(request.getRefreshToken());
return generateRefreshToken(member.getSocialId(), member.getSocialType());
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/cmc/peerna/service/MemberService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cmc.peerna.service;

import cmc.peerna.domain.Member;
import cmc.peerna.redis.domain.RefreshToken;
import cmc.peerna.web.dto.requestDto.MemberRequestDto;
import cmc.peerna.web.dto.responseDto.MemberResponseDto;

Expand All @@ -17,4 +18,6 @@ public interface MemberService {

Member findMemberByUuid(String uuid);
MemberRequestDto.profileUpdateDto updateMemberProfile(Member member, MemberRequestDto.profileUpdateDto request);

String regenerateAccessToken(RefreshToken refreshToken);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,19 @@
import cmc.peerna.domain.PeerGradeResult;
import cmc.peerna.domain.enums.SocialType;
import cmc.peerna.jwt.JwtProvider;
import cmc.peerna.redis.domain.RefreshToken;
import cmc.peerna.repository.MemberRepository;
import cmc.peerna.repository.PeerGradeResultRepository;
import cmc.peerna.service.MemberService;
import cmc.peerna.web.dto.requestDto.MemberRequestDto;
import cmc.peerna.web.dto.responseDto.MemberResponseDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

Expand Down Expand Up @@ -109,4 +112,12 @@ public MemberRequestDto.profileUpdateDto updateMemberProfile(Member member, Memb
member.updateProfile(request);
return MemberConverter.toProfileUpdateDto(member);
}

@Override
public String regenerateAccessToken(RefreshToken refreshToken) {
Member member = memberRepository.findById(refreshToken.getMemberId()).orElseThrow(() -> new MemberException(ResponseStatus.MEMBER_NOT_FOUND));
log.info("Member Id값 : " + member.getId());
String accessToken = jwtProvider.createAccessToken(member.getId(), member.getSocialType().toString(), member.getSocialId(), Arrays.asList(new SimpleGrantedAuthority("USER")));
return accessToken;
}
}
16 changes: 15 additions & 1 deletion src/main/java/cmc/peerna/web/controller/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
import cmc.peerna.apiResponse.code.ResponseStatus;
import cmc.peerna.apiResponse.exception.handler.MemberException;
import cmc.peerna.apiResponse.response.ResponseDto;
import cmc.peerna.converter.MemberConverter;
import cmc.peerna.domain.Member;
import cmc.peerna.domain.enums.UserRole;
import cmc.peerna.feign.dto.KakaoTokenInfoResponseDto;
import cmc.peerna.feign.service.AccountService;
import cmc.peerna.jwt.JwtProvider;
import cmc.peerna.jwt.LoginResponseDto;
import cmc.peerna.jwt.handler.annotation.AuthMember;
import cmc.peerna.redis.domain.RefreshToken;
import cmc.peerna.redis.service.RedisService;
import cmc.peerna.service.MemberService;
import cmc.peerna.service.RootService;
Expand Down Expand Up @@ -195,5 +195,19 @@ public ResponseDto<MemberResponseDto.memberNameResponseDto> getUserNameByUuid(@R
Member memberByUuid = memberService.findMemberByUuid(uuid);
return ResponseDto.of(MemberResponseDto.memberNameResponseDto.builder().name(memberByUuid.getName()).build());
}

@Operation(summary = "refresh token 통해 access token 재발급 API ✔️", description = "refresh token 통해 access token 재발급 API입니다.")
@PostMapping("member/new-token")
public ResponseDto<MemberResponseDto.newTokenDto> getNewAccessToken(@RequestBody MemberRequestDto.ReissueDTO request) {
RefreshToken newRefreshToken = redisService.reGenerateRefreshToken(request);
String accessToken = memberService.regenerateAccessToken(newRefreshToken);

return ResponseDto.of(MemberResponseDto.newTokenDto.builder()
.accessToken(accessToken)
.refreshToken(newRefreshToken.getToken())
.build());
}


}

Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,11 @@ public static class profileUpdateDto{
public static class uuidRequestDto{
private String uuid;
}
@Builder
@Getter
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public static class IssueTokenDto {
String refreshToken;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,13 @@ public static class memberNameResponseDto{
private String name;
}

@Builder
@Getter
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public static class newTokenDto {
private String accessToken;
private String refreshToken;
}

}

0 comments on commit 8698bc5

Please sign in to comment.