【问题标题】:Set the correct ACL on google storage在谷歌存储上设置正确的 ACL
【发布时间】:2018-10-09 10:14:16
【问题描述】:

我们创建了两个微服务,一个从 node.js 将图像上传到 Google 存储(存储桶)。以及从 python 服务返回 serving_url 的服务。两种服务都有效。差不多……

我们的问题是,如果桶中的文件没有正确的ACL,我们就不能从图片服务中获取serving_url()。

我们正在使用 node.js 文件服务中生成的可恢复上传链接从前端上传图片:

createResumeableUpload: async (filename, metadata) => {
            const file = await bucket.file(filename);
            const upload = await file.createResumableUpload({
                metadata,
                public: true,
            });
            return upload;
        },

检查存储桶中的文件后,我们确实获得了所有具有读取权限的用户,请参见下图。但是由于权限无效,对图像服务的转换会抛出异常。

但是如果我们直接在bucket界面上传图片,我们会获得更多的权限,经过一番测试,我们发现下面的权限就是我们要找的就是editers,列表中的第二位:

我们已经尝试了很多,无论是在创建可恢复上传时设置 ACL 还是在创建文件后设置 ACL,但没有任何效果。如果有人能帮助我们如何在文件上设置正确的 ACL,我们将不胜感激,以便我们能够从图像服务中获取 serving_url()。

[编辑] 回答一些问题。我们 100% 确定这是一个权限问题,如果我们添加编辑者的权限,图像服务可以正常工作,但我们需要能够在将图像添加到存储桶时添加此权限。这是我的问题:

当我们从 node.js 服务将图像上传到存储桶时,我们如何为编辑者添加所有者权限?

【问题讨论】:

  • 您能否澄清一下:1)这两个服务是否位于同一个项目中? 2) 哪个服务在进行转换? 3)您能否发布错误消息并解释问题发生在哪个特定步骤? 4) 你在使用 Python API 图像服务吗?如果不是,那绝对值得一看。
  • 1.不仅图像服务在应用引擎上运行。 2. 影像服务正在做转换 3. 我觉得这不重要,我们已经把它钉在了许可上。 4. 是的,因为我写的是python服务,如果不够清楚,抱歉

标签: google-app-engine google-cloud-storage


【解决方案1】:

图片 API 使用 App Engine default service account (YOUR_PROJECT_ID@appspot.gserviceaccount.com)。只要您授予该服务帐户在存储桶上的存储对象管理员角色,该服务帐户就不需要成为 get_serving_url() 的项目所有者即可工作。或者,您可以更新对象 ACL,将对象所有者授予服务帐户。

【讨论】:

    【解决方案2】:

    为了添加必要的权限,您可以向JSON API 发送patch 请求,其中包含定义您希望对象拥有的所有ACL 的JSON。

    更新:

    已代表您创建了一个功能请求,以使该功能可用于 NodeJS 客户端库。请给它加星标,以便您可以收到有关此功能请求的更新,并毫不犹豫地添加其他 cmets 以提供所需实现的详细信息。您可以通过关注this link 来跟踪功能请求。

    【讨论】:

    • 我们更喜欢使用 node.js 集成,甚至在我们创建可恢复下载链接时能够做的更多。这可能吗,还是我们必须自己包装功能?
    • @DNRN 请查看更新后的答案。现在你必须自己包装它,但是已经创建了一个功能请求。
    • 感谢您帮助我。我们需要获取 API 调用的 Bearer 令牌。来自文档:cloud.google.com/storage/docs/authenticationcloud.google.com/storage/docs/reference/… 我们已经启动了环境(将其用于存储桶处理)。我们如何从 GCS 获取令牌?
    • @DNRN 有关 OAuth 令牌的问题,请查看此文档 - developers.google.com/identity/protocols/OAuth2。如果您需要进一步的帮助,应该打开一个单独的问题帖子。
    • 发现这里描述的很清楚的解决方案:isd-soft.com/tech_blog/…
    【解决方案3】:

    在尝试了数小时的 Google ACL 系统之后,我想分享一下我是如何从 nodejs 设置 ACL 的。

    图片文件上传到bucket后,需要添加project owner ACL。如果这个图片文件没有项目所有者ACL,在生成serving_url()时会抛出异常。

    为了更新 ACL,我使用了这个函数:

    updateAcl: async (name: string) => {
        const file = await bucket.file(name);
        console.log('file', file);
    
        const acl = await file.acl.add({
            role: 'OWNER',
            entity: 'project-editors-231929353801'
        });
    
        return acl;
    }
    

    从存储面板中,可以获得所有默认 ACL 的列表。

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2013-04-22
      • 2017-08-23
      • 2015-05-09
      • 1970-01-01
      • 2010-11-10
      • 2015-02-03
      • 1970-01-01
      • 2017-09-05
      相关资源
      最近更新 更多