From 871e23a7da02f8b330aab62b8549424ac2a50302 Mon Sep 17 00:00:00 2001 From: Huynh Thanh Binh <1653006@student.hcmus.edu.vn> Date: Sun, 23 Aug 2020 12:49:34 +0700 Subject: [PATCH] [SERVER] update database using UUID as JWT's jti --- .../auth/SaigonParkingAuthentication.java | 10 ++++--- .../auth/SaigonParkingAuthenticationImpl.java | 25 +++++++++--------- dev/database/backup/auth.bak | Bin 2736128 -> 2867200 bytes dev/database/diagram/auth.png | Bin 7982 -> 10534 bytes dev/database/script/schema/auth_schema.sql | Bin 1924 -> 1926 bytes .../service/auth/entity/UserTokenEntity.java | 10 ++++--- .../interceptor/AuthServiceInterceptor.java | 10 +++---- .../auth/repository/UserTokenRepository.java | 4 +-- .../service/auth/service/AuthService.java | 5 ++-- .../service/grpc/AuthServiceGrpcImpl.java | 7 +++-- .../service/impl/AuthServiceHelperImpl.java | 8 +++--- .../auth/service/impl/AuthServiceImpl.java | 15 ++++++----- 12 files changed, 50 insertions(+), 44 deletions(-) mode change 100644 => 100755 dev/database/script/schema/auth_schema.sql diff --git a/common/src/main/java/com/bht/saigonparking/common/auth/SaigonParkingAuthentication.java b/common/src/main/java/com/bht/saigonparking/common/auth/SaigonParkingAuthentication.java index 50190efa..046664c3 100644 --- a/common/src/main/java/com/bht/saigonparking/common/auth/SaigonParkingAuthentication.java +++ b/common/src/main/java/com/bht/saigonparking/common/auth/SaigonParkingAuthentication.java @@ -1,5 +1,7 @@ package com.bht.saigonparking.common.auth; +import java.util.UUID; + import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -17,14 +19,14 @@ public interface SaigonParkingAuthentication { SaigonParkingTokenBody parseJwtToken(@NotEmpty String jsonWebToken); /* 1st: tokenId, 2nd: token */ - Pair generateAccessToken(@NotNull Long userId, @NotEmpty String userRole); + Pair generateAccessToken(@NotNull Long userId, @NotEmpty String userRole); /* 1st: tokenId, 2nd: token */ - Pair generateRefreshToken(@NotNull Long userId, @NotEmpty String userRole); + Pair generateRefreshToken(@NotNull Long userId, @NotEmpty String userRole); /* 1st: tokenId, 2nd: token */ - Pair generateActivateAccountToken(@NotNull Long userId, @NotEmpty String userRole); + Pair generateActivateAccountToken(@NotNull Long userId, @NotEmpty String userRole); /* 1st: tokenId, 2nd: token */ - Pair generateResetPasswordToken(@NotNull Long userId, @NotEmpty String userRole); + Pair generateResetPasswordToken(@NotNull Long userId, @NotEmpty String userRole); } \ No newline at end of file diff --git a/common/src/main/java/com/bht/saigonparking/common/auth/SaigonParkingAuthenticationImpl.java b/common/src/main/java/com/bht/saigonparking/common/auth/SaigonParkingAuthenticationImpl.java index d458e194..bb2eaa36 100644 --- a/common/src/main/java/com/bht/saigonparking/common/auth/SaigonParkingAuthenticationImpl.java +++ b/common/src/main/java/com/bht/saigonparking/common/auth/SaigonParkingAuthenticationImpl.java @@ -12,6 +12,7 @@ import java.util.Objects; import java.util.Properties; import java.util.Random; +import java.util.UUID; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -84,17 +85,17 @@ private byte[] getSecretKeyByteArray(@NotEmpty String keyPath) throws IOExceptio .getBytes(StandardCharsets.UTF_8)); } - private Pair generateJwtToken(@NotNull SaigonParkingTokenType type, - @NotNull Long userId, - @NotEmpty String userRole, - @NotNull Integer timeAmount, - @NotNull ChronoUnit timeUnit) { + private Pair generateJwtToken(@NotNull SaigonParkingTokenType type, + @NotNull Long userId, + @NotEmpty String userRole, + @NotNull Integer timeAmount, + @NotNull ChronoUnit timeUnit) { Instant now = Instant.now(); Integer factor = new Random().nextInt(MAX_RANDOM_EXCLUSIVE); - String tokenId = UUID_GENERATOR.generate().toString(); + UUID tokenUuid = UUID_GENERATOR.generate(); - return Pair.of(tokenId, Jwts.builder() - .setId(tokenId) + return Pair.of(tokenUuid, Jwts.builder() + .setId(tokenUuid.toString()) .setIssuer(SAIGON_PARKING_ISSUER) .claim(USER_ROLE_KEY_NAME, userRole) .claim(FACTOR_KEY_NAME, factor) @@ -123,22 +124,22 @@ public SaigonParkingTokenBody parseJwtToken(@NotEmpty String jsonWebToken) { } @Override - public Pair generateAccessToken(@NotNull Long userId, @NotEmpty String userRole) { + public Pair generateAccessToken(@NotNull Long userId, @NotEmpty String userRole) { return generateJwtToken(ACCESS_TOKEN, userId, userRole, 30, ChronoUnit.MINUTES); } @Override - public Pair generateRefreshToken(@NotNull Long userId, @NotEmpty String userRole) { + public Pair generateRefreshToken(@NotNull Long userId, @NotEmpty String userRole) { return generateJwtToken(REFRESH_TOKEN, userId, userRole, 30, ChronoUnit.DAYS); } @Override - public Pair generateActivateAccountToken(@NotNull Long userId, @NotEmpty String userRole) { + public Pair generateActivateAccountToken(@NotNull Long userId, @NotEmpty String userRole) { return generateJwtToken(ACTIVATE_TOKEN, userId, userRole, 5, ChronoUnit.MINUTES); } @Override - public Pair generateResetPasswordToken(@NotNull Long userId, @NotEmpty String userRole) { + public Pair generateResetPasswordToken(@NotNull Long userId, @NotEmpty String userRole) { return generateJwtToken(RESET_PW_TOKEN, userId, userRole, 5, ChronoUnit.MINUTES); } } \ No newline at end of file diff --git a/dev/database/backup/auth.bak b/dev/database/backup/auth.bak index 3f38d26457e1ea5404bf3156e6c48d6fda1b7d16..efdb1402f09f6c942443cd74065191e9eaa3680b 100755 GIT binary patch delta 44938 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 Nw8%5rW}!N!{|Ae0aCiU! delta 22432 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 diff --git a/dev/database/diagram/auth.png b/dev/database/diagram/auth.png index 73399462df8a78dbf81c423702890e2334c6452e..34eac49046d86ac70fb59edd7ba131a4fda0442d 100755 GIT binary patch literal 10534 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 Vq4LjyX~!4=>MGjGg?BB2{~Jm>kmvva literal 7982 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 userRoleContext = Context.key("userRole"); @Getter - private final Context.Key tokenIdContext = Context.key("tokenId"); + private final Context.Key tokenIdContext = Context.key("tokenId"); @Getter private final Context.Key tokenTypeContext = Context.key("tokenType"); @Getter @@ -137,12 +138,11 @@ public ServerCall.Listener interceptCall(ServerCall ServerCall.Listener interceptCall(ServerCall ServerCall.Listener interceptCall(ServerCall { /** - * * self-implement findByTokenId method * in order to prevent N+1 problem * using optional to catch null return @@ -26,5 +26,5 @@ public interface UserTokenRepository extends JpaRepository findByTokenId(@NotEmpty String tokenId); + Optional findByTokenId(@NotEmpty UUID tokenId); } \ No newline at end of file diff --git a/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/AuthService.java b/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/AuthService.java index a1189e6f..a2d930eb 100644 --- a/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/AuthService.java +++ b/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/AuthService.java @@ -1,6 +1,7 @@ package com.bht.saigonparking.service.auth.service; import java.util.Date; +import java.util.UUID; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -54,7 +55,7 @@ Pair validateLogin(@NotEmpty String username, */ Triple generateNewToken(@NotNull Long userId, @NotNull Date currentExp, - @NotEmpty String currentTokenId, + @NotEmpty UUID currentTokenId, boolean currentIsRefreshToken); /** @@ -66,6 +67,6 @@ Triple generateNewToken(@NotNull Long userId, */ Triple activateNewAccount(@NotNull Long userId, @NotNull Date currentExp, - @NotEmpty String currentTokenId, + @NotEmpty UUID currentTokenId, boolean currentIsRefreshToken); } \ No newline at end of file diff --git a/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/grpc/AuthServiceGrpcImpl.java b/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/grpc/AuthServiceGrpcImpl.java index 4df913d6..86b39921 100644 --- a/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/grpc/AuthServiceGrpcImpl.java +++ b/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/grpc/AuthServiceGrpcImpl.java @@ -34,6 +34,7 @@ public final class AuthServiceGrpcImpl extends AuthServiceGrpc.AuthServiceImplBa private final AuthService authService; private final AuthServiceInterceptor authServiceInterceptor; + private final UserServiceGrpc.UserServiceBlockingStub userServiceBlockingStub; @Override @@ -132,8 +133,7 @@ public void registerUser(RegisterRequest request, StreamObserver re @Override public void sendResetPasswordEmail(StringValue request, StreamObserver responseObserver) { try { - StringValue email = StringValue.of(authService - .sendResetPasswordEmail(request.getValue())); + StringValue email = StringValue.of(authService.sendResetPasswordEmail(request.getValue())); responseObserver.onNext(email); responseObserver.onCompleted(); @@ -154,8 +154,7 @@ public void sendResetPasswordEmail(StringValue request, StreamObserver responseObserver) { try { - StringValue email = StringValue.of(authService - .sendActivateAccountEmail(request.getValue())); + StringValue email = StringValue.of(authService.sendActivateAccountEmail(request.getValue())); responseObserver.onNext(email); responseObserver.onCompleted(); diff --git a/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/impl/AuthServiceHelperImpl.java b/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/impl/AuthServiceHelperImpl.java index 77979c20..b42c2a07 100644 --- a/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/impl/AuthServiceHelperImpl.java +++ b/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/impl/AuthServiceHelperImpl.java @@ -3,6 +3,8 @@ import static com.bht.saigonparking.common.constant.SaigonParkingMessageQueue.MAIL_TOPIC_ROUTING_KEY; import static com.bht.saigonparking.common.constant.SaigonParkingMessageQueue.USER_TOPIC_ROUTING_KEY; +import java.util.UUID; + import javax.persistence.EntityNotFoundException; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -79,7 +81,7 @@ public void sendMail(@NotNull MailRequestType type, .build()); } - public void saveUserRefreshToken(@NotNull Long userId, @NotEmpty String tokenId) { + public void saveUserRefreshToken(@NotNull Long userId, @NotEmpty UUID tokenId) { try { /* update refresh token id to database if already existed */ UserTokenEntity userTokenEntity = userTokenRepository.findById(userId).orElseThrow(EntityNotFoundException::new); @@ -87,14 +89,12 @@ public void saveUserRefreshToken(@NotNull Long userId, @NotEmpty String tokenId) userTokenRepository.saveAndFlush(userTokenEntity); } catch (EntityNotFoundException entityNotFoundException) { - /* save new refresh token id to database if not existed before */ UserTokenEntity userTokenEntity = UserTokenEntity.builder().userId(userId).tokenId(tokenId).build(); userTokenRepository.saveAndFlush(userTokenEntity); } finally { - LoggingUtil.log(Level.INFO, "SERVICE", "Success", - String.format("saveUserRefreshToken(%d, %s)", userId, tokenId)); + LoggingUtil.log(Level.INFO, "SERVICE", "Success", String.format("saveUserRefreshToken(%d, %s)", userId, tokenId)); } } } \ No newline at end of file diff --git a/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/impl/AuthServiceImpl.java b/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/impl/AuthServiceImpl.java index 84c71ff5..1b79c10e 100644 --- a/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/impl/AuthServiceImpl.java +++ b/service/auth-service/src/main/java/com/bht/saigonparking/service/auth/service/impl/AuthServiceImpl.java @@ -4,6 +4,7 @@ import static com.bht.saigonparking.api.grpc.mail.MailRequestType.RESET_PASSWORD; import java.util.Date; +import java.util.UUID; import javax.persistence.EntityNotFoundException; import javax.validation.constraints.NotEmpty; @@ -65,8 +66,8 @@ public Pair validateLogin(@NotEmpty String username, context.run(() -> authServiceImplHelper.updateUserLastSignIn(user.getId())); /* Generate new access token, new refresh token for user with Id, Role */ - Pair generatedAccessToken = authentication.generateAccessToken(user.getId(), user.getRole().toString()); - Pair generatedRefreshToken = authentication.generateRefreshToken(user.getId(), user.getRole().toString()); + Pair generatedAccessToken = authentication.generateAccessToken(user.getId(), user.getRole().toString()); + Pair generatedRefreshToken = authentication.generateRefreshToken(user.getId(), user.getRole().toString()); /* Asynchronously save user token to the database */ authServiceImplHelper.saveUserRefreshToken(user.getId(), generatedRefreshToken.getFirst()); @@ -136,7 +137,7 @@ public String sendActivateAccountEmail(@NotEmpty String username) { @Override public Triple generateNewToken(@NotNull Long userId, @NotNull Date currentExp, - @NotEmpty String currentTokenId, + @NotEmpty UUID currentTokenId, boolean currentIsRefreshToken) { User user = userServiceBlockingStub.getUserById(Int64Value.of(userId)); @@ -147,7 +148,7 @@ public Triple generateNewToken(@NotNull Long userId, @Override public Triple activateNewAccount(@NotNull Long userId, @NotNull Date currentExp, - @NotEmpty String currentTokenId, + @NotEmpty UUID currentTokenId, boolean currentIsRefreshToken) { User user = userServiceBlockingStub.getUserById(Int64Value.of(userId)); @@ -162,7 +163,7 @@ public Triple activateNewAccount(@NotNull Long userId, @SuppressWarnings("java:S2201") private Triple generateNewToken(@NotNull User user, @NotNull Date currentExp, - @NotEmpty String currentTokenId, + @NotEmpty UUID currentTokenId, boolean currentIsRefreshToken) { try { if (currentIsRefreshToken) { @@ -173,7 +174,7 @@ private Triple generateNewToken(@NotNull User user, throw new InvalidRefreshTokenException(); } - Pair generatedAccessToken = authentication.generateAccessToken(user.getId(), user.getRole().toString()); + Pair generatedAccessToken = authentication.generateAccessToken(user.getId(), user.getRole().toString()); if (((currentExp.getTime() - new Date().getTime()) / 86400000) > 7) { /* Token not nearly expire */ return Triple.of(user.getUsername(), generatedAccessToken.getSecond(), ""); @@ -181,7 +182,7 @@ private Triple generateNewToken(@NotNull User user, } else { /* Token nearly expire */ /* Generate new refresh token for user with Id, Role */ - Pair generatedRefreshToken = authentication.generateRefreshToken(user.getId(), user.getRole().toString()); + Pair generatedRefreshToken = authentication.generateRefreshToken(user.getId(), user.getRole().toString()); authServiceImplHelper.saveUserRefreshToken(user.getId(), generatedRefreshToken.getFirst()); return Triple.of(user.getUsername(), generatedAccessToken.getSecond(), generatedRefreshToken.getSecond());