diff --git a/.idea/jpa.xml b/.idea/jpa.xml index 4319fd7..44e80af 100644 --- a/.idea/jpa.xml +++ b/.idea/jpa.xml @@ -1,7 +1,7 @@ - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 9c5b81b..db3d380 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + \ No newline at end of file diff --git a/config/shared.properties b/config/shared.properties index 8d60eb9..cba6a41 100644 --- a/config/shared.properties +++ b/config/shared.properties @@ -34,5 +34,11 @@ redis.password=VegaHrm@2025 redis.database=0 cors.allowed-origins=* + +google.client.client-id = 719251949807-0jqbsmlh0a116cm8vm47oknmc5vpi19q.apps.googleusercontent.com +google.client.client-secret = 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 +google.client.redirect-uri=http://localhost:8089/api/google/user/callback + + #vcb-lounge.redis.time-to-live=600 #spring.cache.type=simple \ No newline at end of file diff --git a/vega-hrm-auth/build.gradle b/vega-hrm-auth/build.gradle index a21570f..f936042 100644 --- a/vega-hrm-auth/build.gradle +++ b/vega-hrm-auth/build.gradle @@ -23,15 +23,14 @@ dependencies { implementation 'de.mkammerer:argon2-jvm:2.1' implementation "com.google.apis:google-api-services-youtube:v3-rev182-1.22.0" implementation("com.google.collections:google-collections:1.0") - implementation("com.google.guava:guava:20.0") + implementation("com.google.guava:guava:31.1-jre") implementation("com.google.apis:google-api-services-youtubeAnalytics:v2-rev272-1.25.0") implementation "com.google.http-client:google-http-client-jackson2:1.20.0" // OAuth Client - implementation "com.google.oauth-client:google-oauth-client-jetty:1.20.0" implementation 'com.google.apis:google-api-services-oauth2:v2-rev157-1.25.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.api-client:google-api-client:2.3.0' + implementation 'com.google.api-client:google-api-client:1.32.1' // Google Collections implementation "com.google.collections:google-collections:1.0" implementation 'com.google.code.gson:gson:2.11.0' @@ -48,5 +47,13 @@ configurations { // Loại bỏ logging mặc định exclude group: 'ch.qos.logback', module: 'logback-classic' + + exclude group: 'com.google.guava', module: 'guava-jdk5' + exclude group: 'com.google.collections', module: 'google-collections' // very old + + resolutionStrategy { + // bắt buộc dùng guava hiện đại + force "com.google.guava:guava:32.1.3-jre" + } } } diff --git a/vega-hrm-auth/src/main/java/com/vega/hrm/dto/CustomTokenResponse.java b/vega-hrm-auth/src/main/java/com/vega/hrm/dto/CustomTokenResponse.java index 79ae8cc..addaa93 100644 --- a/vega-hrm-auth/src/main/java/com/vega/hrm/dto/CustomTokenResponse.java +++ b/vega-hrm-auth/src/main/java/com/vega/hrm/dto/CustomTokenResponse.java @@ -1,14 +1,21 @@ package com.vega.hrm.dto; import com.google.api.client.auth.oauth2.TokenResponse; +import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; import com.google.api.client.util.Key; +import com.google.api.client.util.Preconditions; -public class CustomTokenResponse extends TokenResponse { +public class CustomTokenResponse extends GoogleTokenResponse { @Key("refresh_token_expires_in") private Long refreshTokenExpiresIn; public Long getRefreshTokenExpiresIn() { - return refreshTokenExpiresIn; + return this.refreshTokenExpiresIn; + } + + public TokenResponse setRefreshTokenExpiresIn(Long refreshTokenExpiresIn) { + this.refreshTokenExpiresIn = Preconditions.checkNotNull(refreshTokenExpiresIn); + return this; } } diff --git a/vega-hrm-auth/src/main/java/com/vega/hrm/service/GoogleService.java b/vega-hrm-auth/src/main/java/com/vega/hrm/service/GoogleService.java index 22be426..edd313d 100644 --- a/vega-hrm-auth/src/main/java/com/vega/hrm/service/GoogleService.java +++ b/vega-hrm-auth/src/main/java/com/vega/hrm/service/GoogleService.java @@ -9,6 +9,7 @@ import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.auth.oauth2.TokenResponse; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; @@ -36,8 +37,8 @@ public class GoogleService { private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); private final TokenStore tokenStore; private final UserGoogleTokenRepository userGoogleTokenRepository; + private final GoogleOAuthConfig googleOAuthConfig; public BaseResponse getGoogleAuthUrl() { - var googleOAuthConfig = GoogleOAuthConfig.builder().build(); NetHttpTransport httpTransport = null; try { httpTransport = GoogleNetHttpTransport.newTrustedTransport(); @@ -59,7 +60,6 @@ public class GoogleService { } public BaseResponse googleCallback(String code) { - var googleOAuthConfig = GoogleOAuthConfig.builder().build(); NetHttpTransport httpTransport = null; try { @@ -77,9 +77,9 @@ public class GoogleService { .setAccessType("offline") .setApprovalPrompt("force") .build(); - CustomTokenResponse tokenResponse = null; + GoogleTokenResponse tokenResponse = null; try { - tokenResponse = (CustomTokenResponse) flow.newTokenRequest(code).setRedirectUri(googleOAuthConfig.redirectUri).execute(); + tokenResponse = (GoogleTokenResponse) flow.newTokenRequest(code).setRedirectUri(googleOAuthConfig.redirectUri).execute(); } catch (IOException e) { return BaseResponse.invalid(e.getMessage()); } @@ -109,9 +109,13 @@ public class GoogleService { userGoogleToken.setRefreshToken(tokenResponse.getRefreshToken()); userGoogleToken.setScope(tokenResponse.getScope()); userGoogleToken.setExpiresIn(tokenResponse.getExpiresInSeconds()); - userGoogleToken.setRefreshTokenExpiresIn(tokenResponse.getRefreshTokenExpiresIn()); - userGoogleToken.setCreatedAt(Instant.now().plusSeconds(tokenResponse.getExpiresInSeconds())); - userGoogleToken.setRefreshTokenExpiresAt(Instant.now().plusSeconds(tokenResponse.getRefreshTokenExpiresIn())); + userGoogleToken.setRefreshTokenExpiresIn(tokenResponse.getExpiresInSeconds()); + userGoogleToken.setExpiresAt(Instant.now().plusSeconds(tokenResponse.getExpiresInSeconds())); + userGoogleToken.setTokenType(tokenResponse.getTokenType()); + + userGoogleToken.setRefreshTokenExpiresAt(Instant.now().plusSeconds(tokenResponse.get("refresh_token_expires_in") != null + ? Long.valueOf(tokenResponse.get("refresh_token_expires_in").toString()) + : null)); userGoogleToken.setCreatedAt(Instant.now()); userGoogleTokenRepository.save(userGoogleToken); } diff --git a/vega-hrm-core/src/main/java/com/vega/hrm/core/constants/CommonConst.java b/vega-hrm-core/src/main/java/com/vega/hrm/core/constants/CommonConst.java index eb6de18..017e651 100644 --- a/vega-hrm-core/src/main/java/com/vega/hrm/core/constants/CommonConst.java +++ b/vega-hrm-core/src/main/java/com/vega/hrm/core/constants/CommonConst.java @@ -9,6 +9,9 @@ public class CommonConst { public static final List SCOPES = Arrays.asList( "https://www.googleapis.com/auth/youtube.readonly", "https://www.googleapis.com/auth/yt-analytics.readonly", - "https://www.googleapis.com/auth/yt-analytics-monetary.readonly" + "https://www.googleapis.com/auth/yt-analytics-monetary.readonly", + "https://www.googleapis.com/auth/userinfo.email", + "https://www.googleapis.com/auth/userinfo.profile" + ); } diff --git a/vega-hrm-core/src/main/java/com/vega/hrm/core/dto/GoogleOAuthConfig.java b/vega-hrm-core/src/main/java/com/vega/hrm/core/dto/GoogleOAuthConfig.java index 7cfb1be..0b61243 100644 --- a/vega-hrm-core/src/main/java/com/vega/hrm/core/dto/GoogleOAuthConfig.java +++ b/vega-hrm-core/src/main/java/com/vega/hrm/core/dto/GoogleOAuthConfig.java @@ -1,14 +1,21 @@ package com.vega.hrm.core.dto; - -import lombok.Builder; import lombok.Getter; import lombok.Setter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + @Getter @Setter -@Builder +@Component public class GoogleOAuthConfig { + + @Value("${google.client.client-id}") public String clientId; + + @Value("${google.client.client-secret}") public String clientSecret; + + @Value("${google.client.redirect-uri}") public String redirectUri; } diff --git a/vega-hrm-core/src/main/java/com/vega/hrm/core/filters/AuthorizationFilter.java b/vega-hrm-core/src/main/java/com/vega/hrm/core/filters/AuthorizationFilter.java index 03fa057..923049e 100644 --- a/vega-hrm-core/src/main/java/com/vega/hrm/core/filters/AuthorizationFilter.java +++ b/vega-hrm-core/src/main/java/com/vega/hrm/core/filters/AuthorizationFilter.java @@ -28,7 +28,7 @@ import org.springframework.web.filter.OncePerRequestFilter; @RequiredArgsConstructor public class AuthorizationFilter extends OncePerRequestFilter { - private static final List EXCLUDE_URIS = List.of("api/auth/user/login","api/google/user/callback"); + private static final List EXCLUDE_URIS = List.of("/api/auth/user/login","/api/google/user/callback"); private final RedisService redisService; @Override diff --git a/vega-hrm-core/src/main/resources/application.properties b/vega-hrm-core/src/main/resources/application.properties index 4b1dcd5..9492855 100644 --- a/vega-hrm-core/src/main/resources/application.properties +++ b/vega-hrm-core/src/main/resources/application.properties @@ -1,4 +1,4 @@ google.client.clientId = 719251949807-0jqbsmlh0a116cm8vm47oknmc5vpi19q.apps.googleusercontent.com google.client.clientSecret = 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 -google.redirect.uri=https://localhost:8443/api/auth/google/callback +google.client.redirect.uri=http://localhost:8089/api/google/user/callback diff --git a/vega-hrm-report/src/main/java/com/vega/hrm/report/controller/ReportGoogleController.java b/vega-hrm-report/src/main/java/com/vega/hrm/report/controller/ReportGoogleController.java index a7b6876..ecd006e 100644 --- a/vega-hrm-report/src/main/java/com/vega/hrm/report/controller/ReportGoogleController.java +++ b/vega-hrm-report/src/main/java/com/vega/hrm/report/controller/ReportGoogleController.java @@ -21,11 +21,10 @@ import org.springframework.web.bind.annotation.RestController; public class ReportGoogleController { private final CreateReportingJobService createReportingJob; + private final GoogleOAuthConfig googleOAuthConfig; @GetMapping("/youtube/demo") public ResponseEntity> getRevenue(GetDragRevenueRequest getDragRevenueRequest) throws GeneralSecurityException, IOException { - - var googleOAuthConfig = GoogleOAuthConfig.builder().build(); var tokenStore = new TokenStore(); createReportingJob.createJobWithStoredCredential( tokenStore,