【问题标题】:List files in a bucket without authorisation in javascript from Google Cloud Storage未经授权在 Google Cloud Storage 的 javascript 中列出存储桶中的文件
【发布时间】:2013-02-16 19:08:40
【问题描述】:

我有一个在 Google Cloud Storage 中同步文件的后端应用程序,并且想在不从后端请求它们的情况下以 javascript 列出存储中的所有文件。我已经设置了 CORS,所有文件的 acl 都是公开的。 API 中有一段关于身份验证的内容:

您使用 Google Cloud Storage API 执行的大部分操作 必须经过身份验证。唯一的例外是对对象的操作 允许匿名访问。对象可以匿名访问,如果 AllUsers 组具有 READ 权限。 AllUsers 组包括任何人 在互联网上。

如何设置 AllUsers 的权限?这只是将 acl 设置为 public-read 吗?

bucket list API 调用是否属于需要进行身份验证的操作,或者是否可以这样做?

这是我想要实现的目标:

$.ajax({
    url: "http://storage.googleapis.com/" + BUCKET_NAME,
    method: "GET",
    headers: {
        "x-goog-project-id": PROJECT_ID
    }
});

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript ajax google-cloud-storage


    【解决方案1】:

    您可以使用JSON API 从 JavaScript 获取存储桶的内容。

    GitHub 上的 storage-metabucket-javascript 项目就是一个如何执行此操作的示例。 bucket listing code is here。请参阅live demo 了解工作解决方案。

    您也可以使用google-api-javascript-client library。 GitHub 上的storage-getting-started-javascript repository 展示了如何使用它的示例。

    【讨论】:

      【解决方案2】:

      为了在未经授权的情况下列出存储桶,您需要在存储桶上(而不是仅在所有对象上)拥有公共读取 acl。但是,您应该谨慎使用公共读取存储桶,因为您可能会在月底收到惊人的账单:)

      【讨论】:

        【解决方案3】:

        为了列出存储桶中的对象,您必须使存储桶匿名可读。转到开发人员控制台存储-> 浏览器。在编辑权限中选择/写入 User - allUsers - Read。存储桶内的文件可以有任何 ACL。

        之后你可以列出如下文件:

        Storage.bucket = 'mybucket';
        
        Storage.listObjectsItems = function(prefix, delimiter, callback) {
          var request = gapi.client.storage.objects.list({
            'bucket' : Storage.bucket,
            'prefix' : prefix,
            'delimiter' : delimiter
          });
          request.execute(function(resp) {
            console.log(resp);
            callback(resp.items);
          });
         };
        
        Storage.listObjectsPrefixes = function(prefix, delimiter, callback) {
        var request = gapi.client.storage.objects.list({
            'bucket' : Storage.bucket,
            'prefix' : prefix,
            'delimiter' : delimiter
        });
        request.execute(function(resp) {
            console.log(resp);
            callback(resp.prefixes);
        });
         };
        

        您可以在此处阅读有关前缀和分隔符的更多信息:https://cloud.google.com/storage/docs/json_api/v1/objects/list

        具体例子: 假设我们在控制台->存储->浏览器中有下一个存储桶结构:

        mybucket/folder1/folder11/..
                         folder12/..
                         folder13/..
                           ...
                         folder1n/..
        

        打电话

        Storage.listObjectsPrefixes('folder1/', '/',callback );
        

        它将返回(作为回调的参数)folder1 中的所有文件夹。

        我没有看到(可能是错误的?)使存储桶匿名可读的财务危险。它只能从有限的域访问,为什么有人会浏览我的存储桶的内容,即使他发现(如何?)这样的存储桶存在。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-12
          • 2013-11-15
          • 2019-11-30
          相关资源
          最近更新 更多