【问题标题】:Unable to connect and create bucket in google cloud storage via java sdk无法通过 java sdk 在谷歌云存储中连接和创建存储桶
【发布时间】:2020-06-22 08:34:01
【问题描述】:

我无法使用 java sdk 创建谷歌云存储桶,下面是我正在使用的代码:

public class App 
{
    public static void main(String... args) throws Exception {

         String projectId = "**********";

         Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
            Page<Bucket> buckets = storage.list();

            for (Bucket bucket : buckets.iterateAll()) {
              System.out.println(bucket.getName());
            }

      }
}

这是我收到的错误消息:

原因: com.google.api.client.googleapis.json.GoogleJsonResponseException:401 未经授权{“代码”:401,“错误”:[{ “域”:“全球”, “位置”:“授权”, “位置类型”:“标题”, "message" : "匿名调用者没有 storage.buckets.list 对项目 833568054484 的访问权限。", "reason" : "required" } ], "message" : "匿名调用者没有 storage.buckets.list 对项目 833568054484 的访问权限。" }

【问题讨论】:

  • 很明显,您试图在不进行身份验证的情况下列出存储桶,而匿名用户无权执行此操作。
  • @StephenC 但项目 id 有必要的权限 String projectId = "**********";存储存储 = StorageOptions.newBuilder().setProjectId(projectId).build().getService(); Page buckets = storage.list(); for (桶桶: buckets.iterateAll()) { System.out.println(bucket.getName()); }
  • 除了授予我使用的项目 ID 许可之外,我还需要做任何事情吗?
  • 1) 将代码放入问题中。 2)显然,您返回的错误是说您尚未进行身份验证。未经身份验证的用户无法执行您尝试执行的操作。您需要进行身份验证。
  • 如何进行身份验证?

标签: java google-cloud-platform google-cloud-storage


【解决方案1】:

您没有进行身份验证,您可以在Using Cloud IAM permissions documentation 上查看如何为您的存储桶添加权限。

如果您想向经过身份验证的用户授予访问权限,您必须选择用户组 allAuthenticatedUsers 并为他们分配 Storage Object Viewer 角色。这将允许所有经过身份验证的用户(甚至匿名用户)查看/列出您存储桶中的权限。

注意:正如您在此documentation 中所见,allAuthenticatedUsers 成员类型应仅在 Internet 上的任何人都可以读取和分析您的数据时使用。因此,如果您不是这种情况,您应该考虑使用不同的访问管理类型。

【讨论】:

    【解决方案2】:

    1.Create a service account

    2.Creating a service account key 用于刚刚创建的服务帐户。记住存储 key.json 文件的路径。

    3.Assign to the service account角色存储管理员

    4.Provide credentials to your application

    一个。使用环境变量

    export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json" 
    

    b.在代码中显式

    
    static void authExplicit(String jsonPath) throws IOException {
      // You can specify a credential file by providing a path to GoogleCredentials.
      // Otherwise credentials are read from the GOOGLE_APPLICATION_CREDENTIALS environment variable.
      GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath))
            .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
      Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
    
      System.out.println("Buckets:");
      Page<Bucket> buckets = storage.list();
      for (Bucket bucket : buckets.iterateAll()) {
        System.out.println(bucket.toString());
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-15
      • 2016-01-31
      • 2018-01-28
      • 1970-01-01
      • 2023-03-26
      • 2023-02-08
      • 2019-08-24
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多