【问题标题】:GCP App Engine Access to GCloud Storage without 'sharing publicly'GCP App Engine 无需“公开共享”即可访问云存储
【发布时间】:2018-06-14 01:29:39
【问题描述】:

我想知道如何授予 Google Cloud Platform App Engine 项目权限以提供来自 Google Cloud Storage 的内容,而无需将 Google Cloud Storage 存储分区权限设置为“公开共享”。

我的应用引擎项目正在运行 Node JS。在允许用户查看内容之前使用 Passport-SAML 身份验证对用户进行身份验证,因此我不想通过 IAM 在单个用户级别设置访问权限。图像和视频目前是从我的应用程序的私人文件夹中提供的,只有在用户通过身份验证后才能访问。我希望将这些资产移动到 Google Cloud Storage 并允许应用程序读取文件,但不提供全球访问权限。我该怎么做呢?我没有找到任何关于它的文档。

【问题讨论】:

    标签: node.js google-app-engine google-cloud-platform google-cloud-storage gcp


    【解决方案1】:

    official documentation中所述:

    默认情况下,当您为项目创建存储桶时,您的应用具有 读取和写入它所需的所有权限

    每当您创建 App Engine 应用程序时,都会有一个默认存储桶,它具有以下优点:

    • 5GB 的免费存储空间。
    • Cloud Storage I/O 操作的免费配额

    默认情况下,它会随您的应用程序自动创建,但无论如何,您都可以按照我之前在其他地方分享的相同链接来创建存储桶。如果您需要超过 5GB 的免费存储空间,您可以将其设为付费存储桶,您只需为超过前 5GB 的存储空间付费。

    然后,您可以将 Cloud Storage Client Libraries 用于 Node.js,并查看一些很好的示例(general samples here 甚至 specific operations over files here)来处理存储桶中的文件。


    更新:

    这里有一个小的工作示例,说明如何使用 Cloud Storage 客户端库通过身份验证请求从您的私有存储桶中检索图像而不将其公开。它在 Cloud Function 中工作,因此在 App Engine 中重现相同的行为应该没有问题。它并不能完全满足您的需求,因为它仅在存储桶中显示图像,没有在 HTML 文件中进行任何集成,但是您应该能够从中构建一些东西(我不太习惯使用 Node.js,不幸的是)。

    我希望这也能有所帮助。

    'use strict';
    
    const gcs = require('@google-cloud/storage')();
    
    exports.imageServer = function imageSender(req, res) {
      let file = gcs.bucket('<YOUR_BUCKET>').file('<YOUR_IMAGE>');
      let readStream = file.createReadStream();
    
      res.setHeader("content-type", "image/jpeg");
      readStream.pipe(res);
    };
    

    【讨论】:

    • 我认为它并不像我的应用程序可以在静态 html 中使用像 storage.googleapis.com/bucketname/imagename.jpg">带有 Google Cloud 客户端库的签名 URL(如 njLT 建议的那样),然后在我的页面中动态使用该 URL?
    • 我认为签名 URL 不能解决您的问题,因为它们会将内容公开给所有拥有该 URL 的人,因此类似于公开内容(但您可以添加过期日期)。签名 URL 被认为无需 Google 帐户即可访问 Cloud Storage 资源,但仍可控制访问。
    • 我明白你的意思。是否有在应用引擎应用程序中显示托管在谷歌云上的非公开图像的最佳做法示例?
    • 经过更多研究后,似乎添加服务帐户密钥可能是前进的方向:medium.com/@iwozzy/…
    • 您分享的最后一个链接只是为了提供图像而将图像公开,这是您在第一种情况下不想要的。经过一番调查,我发现 PHP 和 Python App Engine 库都提供了一个非常有趣的函数,它返回一个不可猜测的公共 URL,它可以更好地满足您的要求 (get_serving_url)。但是,这在 Node.js API 中不可用。我能找到的关于如何从 Node 应用程序提供图像的所有内容都涉及公开文件。
    【解决方案2】:

    我认为这可能对你有用https://cloud.google.com/storage/docs/access-control/create-signed-urls-program 我似乎找不到 nodejs 的 API 文档(谷歌真的在搞乱他们的文档网址)。下面是一些示例代码:

    bucket.upload(filename, options, function(err, file, apiResponse) {
    var mil = Date.now()+60000;
    var config = {
      action: 'read',
      expires: mil
    };
    
    file.getSignedUrl(config, function(err, url) {
      if (err) {
        return;
      }
      console.log(url);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2011-11-13
      • 2012-12-20
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多