Как получить доступ к Google Sheet с учетной записью службы из Java?

#java #google-sheets-api

#java #google-sheets-api

Вопрос:

Я пытаюсь получить доступ к Google Sheet из учетной записи службы (учетная запись службы имеет доступ к листу). Но у меня проблема, вся документация, включая официальные документы, указывает на использование GoogleCredential , которое устарело с 1.7. В устаревшем документе говорится, что вы должны использовать library google-auth-library , и это то, что я делаю в:

 val googleCredentials = ServiceAccountCredentials
      .fromStream(new FileInputStream(CREDENTIALS_FILE_PATH))
      .createScoped(SCOPES)
googleCredentials.refresh()
  

но переменная имеет тип GoogleCredentials , и функция Sheets.Builder не принимает это как действительное HttpRequestInitializer . Поэтому мне пришлось взломать свой путь, используя устаревший класс с:

 val token = googleCredentials.getAccessToken.getTokenValue
val credential = new GoogleCredential().setAccessToken(token)
  

С помощью этого обходного пути я могу получить доступ к Google Sheet, но я уверен, что есть правильный способ сделать это без использования устаревших библиотек.

Кто-нибудь знает, как правильно это сделать?

Оставляя здесь полный фрагмент в качестве ссылки.

 package drivers
import java.io.FileInputStream
import java.util.Collections

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport
import com.google.api.client.json.jackson2.JacksonFactory
import com.google.api.services.sheets.v4.{Sheets, SheetsScopes}
import com.google.auth.oauth2.ServiceAccountCredentials
import com.typesafe.config.ConfigFactory

object TestDriver {

  def main(args: Array[String]): Unit = {
    val config = ConfigFactory.load()
    val spreadsheetId = config.getString("spreadsheetId")
    val CREDENTIALS_FILE_PATH = config.getString("google_application_credentials")

    val SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY)
    val JSON_FACTORY = JacksonFactory.getDefaultInstance
    val APPLICATION_NAME = "my-app"

    val googleCredentials = ServiceAccountCredentials
      .fromStream(new FileInputStream(CREDENTIALS_FILE_PATH))
      .createScoped(SCOPES)
    googleCredentials.refresh()

    val token = googleCredentials.getAccessToken.getTokenValue
    val credential = new GoogleCredential().setAccessToken(token)
    val httpTransport = GoogleNetHttpTransport.newTrustedTransport
    val service = new Sheets.Builder(httpTransport, JSON_FACTORY, credential)
      .setApplicationName(APPLICATION_NAME)
      .build()
    val range = "Sheet1!A1:D1"
    val response = service.spreadsheets().values().get(spreadsheetId, range).execute()
    val values = response.getValues
    values.forEach(println)
  }
  

Ответ №1:

 import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(CREDENTIALS_FILE_PATH))
    .createScoped(Collections.singleton(SCOPES));
  
  • Кроме того, вы также можете создать свои учетные данные из файла .p12:
 GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(httpTransport)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(emailAddress)
    .setServiceAccountPrivateKeyFromP12File(new File("MyProject.p12"))
    .setServiceAccountScopes(Collections.singleton(YOUR SCOPE))
    .build();
  
  • Однако, если вы хотите использовать GoogleCredentials и у вас есть проблемы с HttpRequestInitializer , вы можете использовать HttpCredentialsAdapter

Комментарии:

1. Спасибо, я пошел HttpCredentialsAdapter и работает как шарм. Поскольку я предполагаю, что это будет путь в будущем, я сохраню это.

2. Работает. Вот как вы используете HttpCredentialsAdapter в spring bean: — @Bean fun getGoogCreds(creds: GoogleCredentials): HttpCredentialsAdapter { возвращает HttpCredentialsAdapter(creds) }