【问题标题】:Accessing Cloud Storage Objects via App Engine without making bucket publicly readable通过 App Engine 访问 Cloud Storage 对象而不使存储桶公开可读
【发布时间】:2018-05-12 11:51:19
【问题描述】:

我希望能够从我的 App Engine 应用程序访问 Cloud Storage 存储桶中的文件,而无需将对象或存储桶本身设为公开可读。虽然我知道有很多选项允许通过身份验证访问存储桶对象(客户端库、签名 url 等),但复杂的因素是我希望能够访问具有路径的文件类似于有问题的存储桶的文件夹结构。

例如,如果我让我的存储桶公开可读,我可以使用公共链接访问对象:https://storage.googleapis.com/MY_BUCKET/FOLDER_IN_MY_BUCKET/FILE_IN_FOLER.txt。此 url 模仿存储桶的内部文件夹结构。但是,如果存储桶不是公开可读的,则似乎没有可比较的 url。我的 App Engine App 服务帐户已添加为我需要的存储桶的存储管理员,但我不确定是否有可用于访问存储桶对象的 url。对象的 mediaLink 将不起作用,因为生成信息附加到末尾,并且 selfLink 导致 404 错误。

需要这样的 url 是因为存储桶包含数千个对象。在我的例子中,使用客户端库将它们下载到 App Engine 的持久存储类型中违背了使用云存储的目的。在发出请求时获取所有这些签名的 url 会很耗时,然后我必须在某个地方管理数千个签名的 url。

有没有办法从云存储桶中读取一个可预测的 url,比如公共 url,同时仍然对请求进行身份验证?

【问题讨论】:

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


    【解决方案1】:

    您可以在您的应用引擎应用中创建一个“重定向”端点,而不是尝试在响应中出售数千个签名 URL。

    例如用户对www.myapp.com/fetch/<bucket>/<object> 执行“GET”

    您处理此端点的应用程序引擎代码授权用户确保他们应该具有访问权限,将存储桶/对象从 URL 中提取出来,然后生成一个签名 URL 以授予对资源的访问权限,并返回一个 302 重定向到该 URL。

    【讨论】:

    • 这是个好主意,我认为这可能是最好的方向。但是,这确实需要我创建很多签名的 url。此选项(重定向)与使用 Google CDN 或 CloudFront 相比如何?
    • 由于边缘缓存,CDN 会更快,但 AFAIK Google CDN(当前)不支持任何形式的签名 URL,因此您可以有效地将您的存储桶公开,只需通过 CDN 服务代理.
    【解决方案2】:

    您提到的 URL 可以在不公开存储桶或文件的情况下访问,因为您的浏览器已通过有权访问这些资源的帐户进行身份验证: https://storage.cloud.google.com/MY_BUCKET/FOLDER_IN_MY_BUCK‌​ET/FILE_IN_FOLDER

    关于通过其他应用程序(例如 App Engine)访问文件,您始终可以使用client libraries for your preferred language。您可以在 documentation 中测试 API 的工作方式,只需将 bucket 参数定义为 MY_BUCKET object 参数为 FOLDER_IN_MY_BUCKET/FILE_IN_FOLDER。将其应用于您选择的客户端库时,您应该使用相同的结构。

    【讨论】:

    • storage.googleapis.com 没有 google cookie,因此不允许用户通过浏览器进行身份验证。他们在使用该端点时需要使用 OAuth(或签名 URL)。
    • 你是对的,我的错。我的意思是:https://storage.cloud.google.com/MY_BUCKET/FOLDER_IN_MY_BUCKET/FILE_IN_FOLDER。让我编辑我的答案。感谢您的回复!
    • 这行得通,但我们通常建议不要使用它,因为这意味着您需要将最终用户直接放在 ACL 上(这不是很好的安全性,如果您的最终用户没有 google,则不可能帐户)。该端点也往往......有点难以使用(如果最终用户登录到多个帐户,您需要指定应该使用哪个帐户......这很困难......如果外部用户不是不可能的话)。跨度>
    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2017-07-07
    • 2020-07-03
    • 2019-02-04
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多