使用带有Java API的服务帐户对Google API进行身份验证

我正在尝试使用oauth API通过Java API对Google服务帐户进行身份验证。我希望使用它来访问Google

Bigquery。我的API请求返回了“无效的赠款”。

这是代码,它是基本身份验证示例的副本(不是Bigquery的。而是另一个Google API):

  /** Global instance of the HTTP transport. */

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

/** Global instance of the JSON factory. */

private static final JsonFactory JSON_FACTORY = new JacksonFactory();

private static Bigquery bigquery;

public ServiceAccountExample() {

try {

try {

GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)

.setJsonFactory(JSON_FACTORY)

.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)

.setServiceAccountScopes(BigqueryScopes.BIGQUERY)

.setServiceAccountPrivateKeyFromP12File(new File("GoogleBigQuery-privatekey.p12"))

//.setRefreshListeners(refreshListeners)

//.setServiceAccountUser("email.com")

.build();

credential.refreshToken();

bigquery = new Bigquery.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)

//.setApplicationName("GoogleBigQuery/1.0")

.build();

listDatasets(bigquery, "publicdata");

return;

} catch (IOException e) {

System.err.println(e.getMessage());

}

} catch (Throwable t) {

t.printStackTrace();

}

}

SERVICE_ACCOUNT_EMAIL是以下格式的电子邮件地址:XXXXXXX@developer.gserviceaccount.com

如果我删除credential.refreshToken()行,则在首次调用Bigquery时在listDatasets中失败…否则,在credential.refreshToken()..中它将失败,并出现相同的错误。

BigQuery不接受服务帐户身份验证吗?

我相信我已经通过API控制台正确地完成了所有操作。我有:

  • 开启了对Big Query API的访问权限。
  • 在“ API访问”标签下创建了一个服务帐户。
  • 下载了我的私钥(从上面的代码引用)。
  • 根据我的服务帐户,用户可以“团队”标签下的“可以编辑”访问权限。
  • 已启用结算。

我错过了什么吗?我还有什么需要做的吗?

谢谢..

回答:

服务帐户授权方法可以与BigQuery配合使用。您无需致电credential.refreshToken()。确保可以从应用程序中读取您的私钥文件。这是一个例子:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;

import com.google.api.client.http.HttpTransport;

import com.google.api.client.http.javanet.NetHttpTransport;

import com.google.api.client.json.JsonFactory;

import com.google.api.client.json.jackson.JacksonFactory;

import com.google.api.services.bigquery.Bigquery;

import com.google.api.services.bigquery.BigqueryScopes;

import com.google.api.services.bigquery.Bigquery.Projects;

import com.google.api.services.bigquery.model.*;

import java.io.File;

import java.io.IOException;

import java.security.GeneralSecurityException;

import java.util.List;

public class BigQueryJavaServiceAccount {

public static void main(String[] args) throws IOException, InterruptedException, GeneralSecurityException {

final HttpTransport TRANSPORT = new NetHttpTransport();

final JsonFactory JSON_FACTORY = new JacksonFactory();

GoogleCredential credential = new GoogleCredential.Builder()

.setTransport(TRANSPORT)

.setJsonFactory(JSON_FACTORY)

.setServiceAccountId("SOMETHING@developer.gserviceaccount.com")

.setServiceAccountScopes(BigqueryScopes.BIGQUERY)

.setServiceAccountPrivateKeyFromP12File(new File("key.p12"))

.build();

Bigquery bigquery = Bigquery.builder(TRANSPORT, JSON_FACTORY)

.setHttpRequestInitializer(credential)

.build();

Projects.List projectListRequest = bigquery.projects().list();

ProjectList projectList = projectListRequest.execute();

List<ProjectList.Projects> projects = projectList.getProjects();

System.out.println("Available projects\n----------------\n");

for (ProjectList.Projects project : projects) {

System.out.format("%s\n", project.getProjectReference().getProjectId());

}

}

}

以上是 使用带有Java API的服务帐户对Google API进行身份验证 的全部内容, 来源链接: utcz.com/qa/413238.html

回到顶部