edi*_*iaz 3 java google-api oauth-2.0 google-bigquery
我正在尝试使用服务帐户方法访问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());
}
}
Run Code Online (Sandbox Code Playgroud)
但它抛出以下异常:
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)
Run Code Online (Sandbox Code Playgroud)
在此行上触发了异常:
DatasetList datasetList = datasetRequest.execute();
Run Code Online (Sandbox Code Playgroud)
我从第二行看到来自Google API控制台的帐户ID,如下所示:
Client ID: XXXXX.apps.googleusercontent.com
Email address: XXXXX@developer.gserviceaccount.com
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
找到了!埃里克和迈克尔的代码都运作良好.
通过在客户端计算机上错误地设置时间,可以重现问题中发布的错误.幸运的是,它可以通过正确设置客户端计算机上的时间来解决.
注意:对于它的价值,我使用"Internet时间设置"对话框中的"立即更新"按钮在Windows 7框上同步时间.我认为这应该是非常白痴的...但我想我打败了系统.它修正了秒数,但机器关闭了一分钟.之后,BigQuery调用失败了.手动更改时间后,它成功了.
| 归档时间: |
|
| 查看次数: |
3008 次 |
| 最近记录: |