Google cloud platform GCloud身份验证,使用服务帐户从java应用程序访问BigQuery不起作用

Google cloud platform GCloud身份验证,使用服务帐户从java应用程序访问BigQuery不起作用,google-cloud-platform,google-bigquery,google-oauth,Google Cloud Platform,Google Bigquery,Google Oauth,我想访问BigQuery以从JAVA应用程序中的表中选择数据。首先,我创建了一个服务帐户,并授予了作为BigQuery管理员的权限。服务帐户的Json作为环境变量传递,我使用的代码如下(从中获得) static void authImplicit(){ //如果在构造客户端时未指定凭据,则客户端库将 //通过环境变量GOOGLE\u APPLICATION\u credentials查找凭据。 Storage Storage=StorageOptions.getDefaultInstance()

我想访问BigQuery以从JAVA应用程序中的表中选择数据。首先,我创建了一个服务帐户,并授予了作为BigQuery管理员的权限。服务帐户的Json作为环境变量传递,我使用的代码如下(从中获得)

static void authImplicit(){
//如果在构造客户端时未指定凭据,则客户端库将
//通过环境变量GOOGLE\u APPLICATION\u credentials查找凭据。
Storage Storage=StorageOptions.getDefaultInstance().getService();
System.out.println(“bucket:”);
pagebucket=storage.list();
for(Bucket:Bucket.iterateAll()){
System.out.println(bucket.toString());
}
}
该方法返回401,并返回以下错误响应:

原因:com.google.api.client.googleapis.json.GoogleJsonResponseException:401未经授权 { “代码”:401, “错误”:[{ “域”:“全局”, “位置”:“授权”, “位置类型”:“标题”, “消息”:“需要登录。”, “原因”:“必需” } ], “消息”:“请求缺少所需的身份验证凭据。应为OAuth 2访问令牌、登录cookie或其他有效身份验证凭据。请参阅。”, “状态”:“未经验证” }


从您的描述来看,您似乎没有将json文件放置在环境变量中描述的路径中。这是假设您在属性文件中正确描述了您的项目id,您已经在Google云平台中启用了所需的API。为了更精确地确定这一点,我需要您与我们共享您的文件夹结构和属性文件

我建议您使用CredentialsProvider接口来解决此问题

public interface CredentialsProvider {
  Credentials getCredentials() throws IOException;
}
您可以在此界面上找到更多信息


您还可以从

中查看madeforspring+bigquery。是否可以分享更多详细信息以重现此错误?您是从外部Java应用程序连接还是从app Engine中托管的应用程序连接?您是否按照文档中的说明设置了环境变量?您好@Chris32,是的,它是在本地计算机上运行的外部java应用程序。稍后,我将把我的应用程序放在计算引擎上。但在第一步中,我使用传递的env变量运行类似于下面代码中的impicit()方法。
public interface CredentialsProvider {
  Credentials getCredentials() throws IOException;
}