VegaHRM.Backend/vega-hrm-auth/src/main/java/com/vega/hrm/service/GoogleService.java
2025-11-17 23:20:27 +07:00

128 lines
5.9 KiB
Java

package com.vega.hrm.service;
import static com.vega.hrm.core.constants.CommonConst.SCOPES;
import com.google.api.client.auth.oauth2.AuthorizationCodeFlow;
import com.google.api.client.auth.oauth2.AuthorizationCodeRequestUrl;
import com.google.api.client.auth.oauth2.BearerToken;
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;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.oauth2.Oauth2;
import com.vega.hrm.core.component.TokenStore;
import com.vega.hrm.core.entities.UserGoogleToken;
import com.vega.hrm.core.models.responses.BaseResponse;
import com.vega.hrm.core.dto.GoogleOAuthConfig;
import com.google.api.services.oauth2.model.Userinfo;
import com.vega.hrm.core.repositories.UserGoogleTokenRepository;
import com.vega.hrm.dto.CustomTokenResponse;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.time.Instant;
import java.util.Objects;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
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<String> getGoogleAuthUrl() {
NetHttpTransport httpTransport = null;
try {
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
} catch (GeneralSecurityException | IOException e) {
return BaseResponse.invalid(e.getMessage());
}
GoogleClientSecrets.Details details = new GoogleClientSecrets.Details();
details.setClientId(googleOAuthConfig.clientId);
details.setClientSecret(googleOAuthConfig.clientSecret);
GoogleClientSecrets clientSecrets = new GoogleClientSecrets().setInstalled(details);
AuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
.setAccessType("offline")
.setApprovalPrompt("force")
.build();
AuthorizationCodeRequestUrl authorizationUrl = flow.newAuthorizationUrl().setRedirectUri(googleOAuthConfig.redirectUri);
return BaseResponse.success("00",authorizationUrl.toString());
}
public BaseResponse<Boolean> googleCallback(String code) {
NetHttpTransport httpTransport = null;
try {
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
} catch (GeneralSecurityException | IOException e) {
BaseResponse.invalid(e.getMessage());
}
GoogleClientSecrets.Details details = new GoogleClientSecrets.Details();
details.setClientId(googleOAuthConfig.clientId);
details.setClientSecret(googleOAuthConfig.clientSecret);
GoogleClientSecrets clientSecrets = new GoogleClientSecrets().setInstalled(details);
AuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
.setAccessType("offline")
.setApprovalPrompt("force")
.build();
GoogleTokenResponse tokenResponse = null;
try {
tokenResponse = (GoogleTokenResponse) flow.newTokenRequest(code).setRedirectUri(googleOAuthConfig.redirectUri).execute();
} catch (IOException e) {
return BaseResponse.invalid(e.getMessage());
}
Credential credential = new Credential(BearerToken.authorizationHeaderAccessMethod())
.setAccessToken(tokenResponse.getAccessToken());
Oauth2 oauth2 = new Oauth2.Builder(
Objects.requireNonNull(httpTransport), JSON_FACTORY, credential)
.setApplicationName("VEGA_HRM")
.build();
Userinfo userInfo = null;
try {
userInfo = oauth2.userinfo().get().execute();
} catch (IOException e) {
return BaseResponse.invalid(e.getMessage());
}
String email = userInfo.getEmail();
var userGoogleToken = userGoogleTokenRepository.findUserGoogleTokenByEmail(email);
if (userGoogleToken == null) {
userGoogleToken = new UserGoogleToken();
userGoogleToken.setId(UUID.randomUUID());
userGoogleToken.setEmail(email);
userGoogleToken.setAccessToken(tokenResponse.getAccessToken());
userGoogleToken.setRefreshToken(tokenResponse.getRefreshToken());
userGoogleToken.setScope(tokenResponse.getScope());
userGoogleToken.setExpiresIn(tokenResponse.getExpiresInSeconds());
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);
}
tokenStore.storeToken(email, tokenResponse);
return BaseResponse.success("00",true);
}
}