当前位置: 首页 > 面试题库 >

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

宇文学博
2023-03-14
问题内容

我正在尝试使用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());
    }
  }
}


 类似资料:
  • 下面是示例代码:https://code.google.com/p/google-api-dotnet-client/wiki/oauth2#service_accounts 授权失败:dotnetOpenAuth.Messaging.ProtocolException:发送直接消息或获取响应时出错。 内部异常是System.net.WebException:远程服务器返回错误:(400)Bad

  • 这是服务到服务身份验证中概述的规则的一个例外吗?该规则规定需要设置为接收服务的url(例如https://xxxxx.run.app)。和是一回事吗? 最后,除了使用googlecloudsdk(即imaging不存在)之外,是否还有其他方法使用用户帐户而不是服务帐户进行身份验证?

  • 我的团队目前正在开发一个应用程序,使用Admin SDK在GCP中列出公司的域用户,用于入职和非入职目的。 我们使用一个服务帐户来完成这个任务,并且在Google Admin's advanced settings中添加了 作用域。管理SDK API被激活,我们可以在凭据区域中看到服务帐户。 当我们使用参数 和 调用https://www.googleapis.com/admin/director

  • 我有一个带有AzureSQL后端的MS Access前端应用程序(accdb)。我目前正在使用SQL服务器身份验证,但我想使用某种活动目录。我没有本地广告,所以我最初考虑设置Azure广告。然而,我们的小团队已经在使用Office 365,据我所知,O365由Azure AD提供支持。 所以我的问题是,是否可以使用O365帐户(微软通常称之为“工作帐户”)来针对Azure SQL后端进行身份验证?

  • 我正在努力解决这个问题:我正在尝试使用一个服务帐户,从PHP脚本在Google日历中创建一个事件。 以下是我所做的: 创建了一个Google Cloud Project 启用日历API 创建了一个OAuth 2.0服务帐户,其中包含客户端ID、电子邮件地址和公钥 下载了密钥文件并将其保存在我的网站中 使用服务帐户中创建的电子邮件地址共享我的日历(具有管理共享权限) 这是我的代码: 我已经尽可能地调