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,