gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:34:24 26 4
gpt4 key购买 nike

我正在尝试使用 oauth API 通过 Java API 对谷歌服务帐户进行身份验证。我希望用它来访问 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 时在 listsDatasets 中失败...否则它会在 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 - 使用带有 Java API 的服务帐户对 Google API 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11827817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com