java - BigQuery 和 OAuth2

标签 java google-api oauth-2.0 google-bigquery

我正在尝试使用 Service Account 访问 Google BigQuery方法。我的代码如下:

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

private static final JsonFactory JSON_FACTORY = new JacksonFactory();

GoogleCredential credentials = new GoogleCredential.Builder()
            .setTransport(HTTP_TRANSPORT)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
            .setServiceAccountScopes(BigqueryScopes.BIGQUERY)
            .setServiceAccountPrivateKeyFromP12File(
                    new File("PATH-TO-privatekey.p12"))
            .build();
    Bigquery bigquery = Bigquery.builder(HTTP_TRANSPORT, JSON_FACTORY).setHttpRequestInitializer(credentials)
            .build();
    com.google.api.services.bigquery.Bigquery.Datasets.List datasetRequest = bigquery.datasets().list(
            "PROJECT_ID");

    DatasetList datasetList = datasetRequest.execute();
    if (datasetList.getDatasets() != null) {
        java.util.List<Datasets> datasets = datasetList.getDatasets();
        System.out.println("Available datasets\n----------------");
        for (Datasets dataset : datasets) {
            System.out.format("%s\n", dataset.getDatasetReference().getDatasetId());
        }
    }

但它抛出以下异常:

Exception in thread "main"  com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
  "code" : 401,
  "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Authorization required",
    "reason" : "required"
  } ],
  "message" : "Authorization required"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159)
at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187)
at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115)
at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112)
at com.google.api.services.bigquery.Bigquery$Datasets$List.execute(Bigquery.java:979)

异常在这一行被触发:

  DatasetList datasetList = datasetRequest.execute();

我从 Google 的 API 控制台的第二行获取帐户 ID,如下所示:

    Client ID:  XXXXX.apps.googleusercontent.com
    Email address:  XXXXX@developer.gserviceaccount.com

我错过了什么?

最佳答案

Eureka ! Eric 和 Michael 的代码都运行良好。

问题中发布的错误可以通过错误地设置客户端计算机上的时间来重现。幸运的是,可以通过在客户端机器上正确设置时间来解决

注意:为了它的值(value),我使用“Internet 时间设置”对话框中的“立即更新”按钮同步了 Windows 7 机器上的时间。我认为这应该是非常安全的......但我想我击败了系统。它纠正了秒数,但让机器关闭了整整一分钟。此后 BigQuery 调用失败。手动修改时间成功。

关于java - BigQuery 和 OAuth2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524576/

相关文章:

oauth-2.0 - 您是否为 OAuth 2.0 请求生成后端或前端状态参数?

Android 谷歌服务位置成本和限制

django - 在 OAuth2.0 dance 中找不到服务 "memcache"的 api 代理

ios - New Box iOS SDK 示例应用程序问题

java - 我可以将 String 变量转换为 int 变量吗

android - 如何获取新的 GoogleApiAvailability.getErrorDialog() 的请求代码?

c# - 列出 Google Drive api 中的文件会导致系统格式异常

java - 自定义监视器的输出

java - 在 Linux 上安装最新的 Java 版本

java - Scala Eclipse IDE 编译器在运行 "clean"之前给出错误