diff --git a/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/auth/AuthController.java b/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/auth/AuthController.java index e37bb9c..81ad1a4 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/auth/AuthController.java +++ b/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/auth/AuthController.java @@ -19,9 +19,6 @@ import net.beetechgroup.beetask.usecase.user.create.CreateUserInput; import net.beetechgroup.beetask.usecase.user.create.CreateUserOutput; import net.beetechgroup.beetask.usecase.user.create.CreateUserUseCase; -import java.time.LocalDateTime; -import java.util.List; - import io.quarkus.security.Authenticated; import io.quarkus.security.identity.SecurityIdentity; import jakarta.ws.rs.GET; diff --git a/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/TokenConstants.java b/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/TokenConstants.java new file mode 100644 index 0000000..1b0b142 --- /dev/null +++ b/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/TokenConstants.java @@ -0,0 +1,9 @@ +package net.beetechgroup.beetask.usecase.auth; + +public final class TokenConstants { + + public static final long ACCESS_TOKEN_EXPIRY_SECONDS = 3600L; // 1 hour + public static final long REFRESH_TOKEN_EXPIRY_SECONDS = 86400L; // 24 hours + + private TokenConstants() {} +} diff --git a/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/login/LoginUseCase.java b/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/login/LoginUseCase.java index c242390..d11cffb 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/login/LoginUseCase.java +++ b/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/login/LoginUseCase.java @@ -3,9 +3,10 @@ package net.beetechgroup.beetask.usecase.auth.login; import io.smallrye.jwt.build.Jwt; import net.beetechgroup.beetask.entities.User; import net.beetechgroup.beetask.entities.organization.UserOrganization; +import net.beetechgroup.beetask.usecase.auth.TokenConstants; import net.beetechgroup.beetask.usecase.repository.UserRepository; -import java.time.LocalDateTime; +import java.time.Instant; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -51,7 +52,7 @@ public class LoginUseCase { .upn(user.getEmail()) .groups(groups) .claim("name", user.getName()) - .expiresIn(3600) + .expiresIn(TokenConstants.ACCESS_TOKEN_EXPIRY_SECONDS) .sign(); List orgs = userOrganizations.stream() @@ -69,7 +70,7 @@ public class LoginUseCase { String refreshToken = Jwt.issuer(this.issuer) .upn(user.getEmail()) - .expiresIn(86400) // 24 hours + .expiresIn(TokenConstants.REFRESH_TOKEN_EXPIRY_SECONDS) .sign(); LOGGER.infof("Login completed for user %s with %d organizations", user.getEmail(), orgs.size()); @@ -79,8 +80,8 @@ public class LoginUseCase { Objects.nonNull(user.getPhoto()) ? user.getPhoto() : "https://ui-avatars.com/api/?name=" + user.getName().replace(" ", "+") + "&background=random", token, refreshToken, - 3600L, - LocalDateTime.now().toString(), + TokenConstants.ACCESS_TOKEN_EXPIRY_SECONDS, + Instant.now().toString(), orgs ); } diff --git a/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/refresh/RefreshTokenUseCase.java b/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/refresh/RefreshTokenUseCase.java index 8c6c2ed..caea0db 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/refresh/RefreshTokenUseCase.java +++ b/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/refresh/RefreshTokenUseCase.java @@ -5,11 +5,12 @@ import io.smallrye.jwt.auth.principal.ParseException; import io.smallrye.jwt.build.Jwt; import net.beetechgroup.beetask.entities.User; import net.beetechgroup.beetask.entities.organization.UserOrganization; +import net.beetechgroup.beetask.usecase.auth.TokenConstants; import net.beetechgroup.beetask.usecase.auth.login.LoginOutput; import net.beetechgroup.beetask.usecase.repository.UserRepository; import org.eclipse.microprofile.jwt.JsonWebToken; -import java.time.LocalDateTime; +import java.time.Instant; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -58,13 +59,12 @@ public class RefreshTokenUseCase { .upn(user.getEmail()) .groups(groups) .claim("name", user.getName()) - .expiresIn(3600) + .expiresIn(TokenConstants.ACCESS_TOKEN_EXPIRY_SECONDS) .sign(); - // Generate a new refresh token (also a JWT but with longer expiration) String newRefreshToken = Jwt.issuer(this.issuer) .upn(user.getEmail()) - .expiresIn(86400) // 24 hours + .expiresIn(TokenConstants.REFRESH_TOKEN_EXPIRY_SECONDS) .sign(); List orgs = userOrganizations.stream() @@ -87,8 +87,8 @@ public class RefreshTokenUseCase { Objects.nonNull(user.getPhoto()) ? user.getPhoto() : "https://ui-avatars.com/api/?name=" + user.getName().replace(" ", "+") + "&background=random", newToken, newRefreshToken, - 3600L, - LocalDateTime.now().toString(), + TokenConstants.ACCESS_TOKEN_EXPIRY_SECONDS, + Instant.now().toString(), orgs ); } catch (ParseException e) {