#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:
- Информация сбивает с толку, библиотека аутентификации Google, которую рекомендуется использовать, поскольку устаревание включает
google-auth-library-oauth2
библиотеку - Другими словами, вы все еще можете использовать
GoogleCredential
, и это все еще метод, рекомендованный в документации:
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) }