您如何使用来自 Java 的服务帐户访问 Google Sheet?
How do you access a Google Sheet with a service account from Java?
我正在尝试从服务帐户访问 Google Sheet(服务帐户可以访问 sheet)。但是我有一个问题,包括 official docs 在内的所有文档都指向使用自 1.7 以来不推荐使用的 GoogleCredential
。弃用说你应该使用库 google-auth-library
而这就是我在做的事情:
val googleCredentials = ServiceAccountCredentials
.fromStream(new FileInputStream(CREDENTIALS_FILE_PATH))
.createScoped(SCOPES)
googleCredentials.refresh()
但是变量的类型是 GoogleCredentials
并且函数 Sheets.Builder
不接受它作为有效的 HttpRequestInitializer
。所以我不得不想方设法使用已弃用的 class 和:
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)
}
- 信息混乱,Google Auth Library that is recommended to use 因为弃用包括
google-auth-library-oauth2
库
- 换句话说,你仍然可以使用
GoogleCredential
,并且仍然是documentation中推荐的方法:
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
我正在尝试从服务帐户访问 Google Sheet(服务帐户可以访问 sheet)。但是我有一个问题,包括 official docs 在内的所有文档都指向使用自 1.7 以来不推荐使用的 GoogleCredential
。弃用说你应该使用库 google-auth-library
而这就是我在做的事情:
val googleCredentials = ServiceAccountCredentials
.fromStream(new FileInputStream(CREDENTIALS_FILE_PATH))
.createScoped(SCOPES)
googleCredentials.refresh()
但是变量的类型是 GoogleCredentials
并且函数 Sheets.Builder
不接受它作为有效的 HttpRequestInitializer
。所以我不得不想方设法使用已弃用的 class 和:
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)
}
- 信息混乱,Google Auth Library that is recommended to use 因为弃用包括
google-auth-library-oauth2
库 - 换句话说,你仍然可以使用
GoogleCredential
,并且仍然是documentation中推荐的方法:
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