Google bigquery Google Bigquery 401使用服务帐户时出现未经授权的错误

Google bigquery Google Bigquery 401使用服务帐户时出现未经授权的错误,google-bigquery,Google Bigquery,当我在电脑上尝试Michael的bigquery代码片段时,遇到了“401未经授权”问题。正如ryguyrg所建议的那样,我同步了我的计算机时间(通过单击“立即更新”),代码正常工作。但问题是,过了一段时间,可能几分钟,当我重新运行代码时,代码再次失败,出现401错误。因此,几乎每次我想要运行大型查询请求时,我都必须手动同步我的计算机时间 我很确定我的电脑工作正常,而且时间与服务器之间的差异不应该超过几毫秒。那么到底是什么原因导致了问题?我应该在请求之前尝试从代码同步时间,还是有更好的方法 以下

当我在电脑上尝试Michael的bigquery代码片段时,遇到了“401未经授权”问题。正如ryguyrg所建议的那样,我同步了我的计算机时间(通过单击“立即更新”),代码正常工作。但问题是,过了一段时间,可能几分钟,当我重新运行代码时,代码再次失败,出现401错误。因此,几乎每次我想要运行大型查询请求时,我都必须手动同步我的计算机时间

我很确定我的电脑工作正常,而且时间与服务器之间的差异不应该超过几毫秒。那么到底是什么原因导致了问题?我应该在请求之前尝试从代码同步时间,还是有更好的方法

以下是401错误消息,以供参考:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
    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$Jobs$Insert.executeUnparsed(Bigquery.java:1418)
    at com.google.api.services.bigquery.Bigquery$Jobs$Insert.execute(Bigquery.java:1442)
    at BigQueryJavaServiceAccount.main(BigQueryJavaServiceAccount.java:83)

我首先要确保使用ntpd同步您的时间,并将其设置为正确的时区:

几毫秒不会影响它

如果你的请求时间在将来,那么失败的可能性最大——谷歌的服务器肯定会拒绝这些请求

我同意Michael关于通过NTP同步的建议


我们还可以考虑让我们的OAuth服务稍微宽松一点,但要平衡安全性和可用性总是很困难的

在这个例子中,我也遇到了同样的问题。

我试图按下面的命令操作,但发生了401错误

export-GOOGLE\u-APPLICATION\u-CREDENTIALS=/Users/mattheu/credentialFileName.json

我用下面的方法解决了凭证问题

String jsonPath = "/Users/mattheu/credentialFileName.json";
        GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath));
package-com;
导入com.google.auth.oauth2.GoogleCredentials;
导入com.google.cloud.bigquery.*;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.util.UUID;
公共类应用程序{
公共静态void main(字符串[]args)引发InterruptedException、IOException{
字符串jsonPath=“/Users/mattheu/credentialFileName.json”;
GoogleCredentials=GoogleCredentials.fromStream(新文件输入流(jsonPath));
BigQuery BigQuery=BigQueryOptions.newBuilder()
.setCredentials(凭证)
.build().getService();
QueryJobConfiguration查询配置=
QueryJobConfiguration.newBuilder(
“选择”
+“海螺('https://stackoverflow.com/questions/“,强制转换(id为字符串))为url,”
+“查看\u计数”
+“来自` bigquery public data.stackoverflow.posts\u questions`”
+“其中包含“%google bigquery%”之类的标记”
+“按收藏夹订购\u计数说明限制10”)
//对查询使用标准SQL语法。
//见:https://cloud.google.com/bigquery/sql-reference/
.setUseLegacySql(false)
.build();
//创建作业ID,以便我们可以安全地重试。
JobId JobId=JobId.of(UUID.randomUUID().toString());
Job queryJob=bigquery.create(JobInfo.newBuilder(queryConfig.setJobId(jobId.build());
//等待查询完成。
queryJob=queryJob.waitFor();
//检查错误
if(queryJob==null){
抛出新的RuntimeException(“作业不再存在”);
}else if(queryJob.getStatus().getError()!=null){
//您还可以查看queryJob.getStatus().getExecutionErrors()中的所有
//错误,而不仅仅是最新的错误。
抛出新的RuntimeException(queryJob.getStatus().getError().toString());
}
QueryResponse response=bigquery.getQueryResults(作业ID);
TableResult=queryJob.getQueryResults();
//打印结果的所有页面。
for(FieldValueList行:result.iterateAll()){
字符串url=row.get(“url”).getStringValue();
long viewCount=row.get(“view_count”).getLongValue();
System.out.printf(“url:%s视图:%d%n”,url,视图计数);
}
}
}
结果:
url:views:27736
url:views:4732
url:views:9674
url:views:3549
url:views:3332
url:views:6928
url:views:11635
url:views:4279
url:views:8552
url:views:3213