Implement regenerate token
This commit is contained in:
@@ -28,7 +28,7 @@ public AuthenticationManager authenticationManager(AuthenticationConfiguration a
|
|||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
- [ ] Implement regenerate refresh token
|
- [ ] Implement regenerate refresh token test code
|
||||||
|
|
||||||
### Done ✓
|
### Done ✓
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package demo.api.auth;
|
package demo.api.auth;
|
||||||
|
|
||||||
import demo.api.auth.dtos.SignUpRes;
|
import demo.api.auth.dtos.SignUpRes;
|
||||||
|
import demo.api.jwt.dtos.RegenerateTokenDto;
|
||||||
import demo.api.jwt.dtos.TokenDto;
|
import demo.api.jwt.dtos.TokenDto;
|
||||||
import demo.api.auth.dtos.SignInReq;
|
import demo.api.auth.dtos.SignInReq;
|
||||||
import demo.api.auth.dtos.SignUpReq;
|
import demo.api.auth.dtos.SignUpReq;
|
||||||
@@ -25,7 +26,12 @@ public class AuthController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/signIn")
|
@PostMapping("/signIn")
|
||||||
public ResponseEntity<TokenDto> signIn(@Validated SignInReq signInReq, HttpServletResponse res) {
|
public ResponseEntity<TokenDto> signIn(@Validated SignInReq signInReq) {
|
||||||
return authService.signIn(signInReq);
|
return authService.signIn(signInReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/regenerateToken")
|
||||||
|
public ResponseEntity<TokenDto> regenerateToken(@Validated RegenerateTokenDto refreshTokenDto) {
|
||||||
|
return authService.regenerateToken(refreshTokenDto);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package demo.api.auth;
|
package demo.api.auth;
|
||||||
|
|
||||||
import demo.api.auth.dtos.SignUpRes;
|
import demo.api.auth.dtos.SignUpRes;
|
||||||
|
import demo.api.jwt.dtos.RegenerateTokenDto;
|
||||||
import demo.api.jwt.dtos.TokenDto;
|
import demo.api.jwt.dtos.TokenDto;
|
||||||
import demo.api.auth.dtos.SignInReq;
|
import demo.api.auth.dtos.SignInReq;
|
||||||
import demo.api.auth.dtos.SignUpReq;
|
import demo.api.auth.dtos.SignUpReq;
|
||||||
@@ -20,4 +21,6 @@ public interface AuthService {
|
|||||||
* @return json web token
|
* @return json web token
|
||||||
*/
|
*/
|
||||||
ResponseEntity<TokenDto> signIn(SignInReq signInReq);
|
ResponseEntity<TokenDto> signIn(SignInReq signInReq);
|
||||||
|
|
||||||
|
ResponseEntity<TokenDto> regenerateToken(RegenerateTokenDto refreshTokenDto);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package demo.api.auth;
|
|||||||
import demo.api.auth.dtos.SignUpRes;
|
import demo.api.auth.dtos.SignUpRes;
|
||||||
import demo.api.exception.CustomException;
|
import demo.api.exception.CustomException;
|
||||||
import demo.api.jwt.JwtTokenProvider;
|
import demo.api.jwt.JwtTokenProvider;
|
||||||
|
import demo.api.jwt.dtos.RegenerateTokenDto;
|
||||||
import demo.api.jwt.dtos.TokenDto;
|
import demo.api.jwt.dtos.TokenDto;
|
||||||
import demo.api.user.domain.User;
|
import demo.api.user.domain.User;
|
||||||
import demo.api.auth.dtos.SignInReq;
|
import demo.api.auth.dtos.SignInReq;
|
||||||
@@ -84,7 +85,48 @@ public class AuthServiceImpl implements AuthService {
|
|||||||
|
|
||||||
return new ResponseEntity<>(tokenDto, httpHeaders, HttpStatus.OK);
|
return new ResponseEntity<>(tokenDto, httpHeaders, HttpStatus.OK);
|
||||||
} catch (AuthenticationException e) {
|
} catch (AuthenticationException e) {
|
||||||
throw new CustomException("Invalid credentials supplied", HttpStatus.UNPROCESSABLE_ENTITY);
|
throw new CustomException("Invalid credentials supplied", HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<TokenDto> regenerateToken(RegenerateTokenDto refreshTokenDto) {
|
||||||
|
String refresh_token = refreshTokenDto.getRefresh_token();
|
||||||
|
try {
|
||||||
|
// 1. Refresh Token 검증
|
||||||
|
if (!jwtTokenProvider.validateRefreshToken(refresh_token)) {
|
||||||
|
throw new CustomException("Invalid refresh token supplied", HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Access Token 에서 User email 를 가져옵니다.
|
||||||
|
Authentication authentication = jwtTokenProvider.getAuthentication(refresh_token);
|
||||||
|
|
||||||
|
// 3. Redis 에서 User email 을 기반으로 저장된 Refresh Token 값을 가져옵니다.
|
||||||
|
String refreshToken = (String)redisTemplate.opsForValue().get(authentication.getName());
|
||||||
|
if(!refreshToken.equals(refresh_token)) {
|
||||||
|
throw new CustomException("Refresh Token doesn't match.", HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 새로운 토큰 생성
|
||||||
|
String new_refresh_token = jwtTokenProvider.generateRefreshToken(authentication);
|
||||||
|
TokenDto tokenDto = new TokenDto(
|
||||||
|
jwtTokenProvider.generateAccessToken(authentication),
|
||||||
|
new_refresh_token
|
||||||
|
);
|
||||||
|
|
||||||
|
// 5. RefreshToken Redis 업데이트
|
||||||
|
redisTemplate.opsForValue().set(
|
||||||
|
authentication.getName(),
|
||||||
|
new_refresh_token,
|
||||||
|
refresh_token_expire_time,
|
||||||
|
TimeUnit.MILLISECONDS
|
||||||
|
);
|
||||||
|
|
||||||
|
HttpHeaders httpHeaders = new HttpHeaders();
|
||||||
|
|
||||||
|
return new ResponseEntity<>(tokenDto, httpHeaders, HttpStatus.OK);
|
||||||
|
} catch (AuthenticationException e) {
|
||||||
|
throw new CustomException("Invalid refresh token supplied", HttpStatus.BAD_REQUEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
10
src/main/java/demo/api/jwt/dtos/RegenerateTokenDto.java
Normal file
10
src/main/java/demo/api/jwt/dtos/RegenerateTokenDto.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package demo.api.jwt.dtos;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public class RegenerateTokenDto {
|
||||||
|
private String refresh_token;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user