I am developing a spring-boot application that needs to upload files to a Google Drive account. I found a thread for storing the access_token, and refresh token, but was deprecated, here is the link: How to store credentials for Google Drive SDK locally. Is there a way using v3 to implement google drive authentication once, and refresh the access token when needed?
Below is a service that upload files to drive
@Service
public class GoogleDriveService {
private static final String baseConfigPath = "/config.json";
private static final String APPLICATION_NAME = "application name";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";
private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE);
private static final String CREDENTIALS_FILE_PATH = "/client_secret.json";
/////////////////////////////////////////////////////////////////////////////////////////
public static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// Load client secrets.
InputStream in = GoogleDriveClient.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
if (in == null) {
throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setHost("127.0.0.1").setPort(8089).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}
public boolean uploadGoogleDriveFile(java.io.File originalFile){
final NetHttpTransport HTTP_TRANSPORT;
try {
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
File file = new File();
file.setName(originalFile.getName());
FileContent content = new FileContent("text/plain", originalFile);
File uploadedFile = service.files().create(file, content).setFields("id").execute();
System.out.println("File ID: " + uploadedFile.getId());
return true;
} catch (GeneralSecurityException | IOException e) {
e.printStackTrace();
return false;
}
}
}