如何从URL

时间:2019-04-25 08:21:10

标签: firebase google-cloud-storage firebase-storage

我正在使用Google存储设备存储用户的个人资料照片。我有几千张照片。

现在,将图片保存在存储桶中,如下所示: 数据/图片/个人资料/USER_ID.jpg

因此图像的URL: https://storage.cloud.google.com/data/images/profiles/USER_ID.jpg

我不希望用户仅知道他们的USER_ID就能看到其他人的照片,但是,它必须是USER_ID,以便从开发人员的角度更轻松地进行搜索。

我无法使用签名URL,因为我的用户没有Google帐户,并且存储中的图片是从移动应用程序中获取的。

是否有一种方法可以将文件名保留在存储中,但是可以简单地从URL隐藏路径+文件名?

https://storage.cloud.google.com/fc720d5c05411b03e5e2a6692f8d7d61.jpg -> points to https://storage.cloud.google.com/data/images/profiles/USER_ID.jpg

谢谢

3 个答案:

答案 0 :(得分:0)

您有几种选择。这里有一些:

  • 让用户从服务器请求另一个用户的URL,然后让服务器决定是否允许该用户查看图像。如果是这样,请让服务器(确实具有服务帐户)生成一个签名的URL,并将其传递回用户(或重定向到该URL)。这样,尽管用户可能知道另一个用户的用户ID和他们图像的URL,但除非服务器同意这是可以的,否则他们仍然看不到该图像。
  • 使用Firebase存储管理图像,这些图像仍将存储在GCS中,但会为您提供Firebase的身份验证支持。
  • 通过您的应用程序(应用程序引擎应用程序或在GCE或GKE中运行的某种东西)代理图像。这样一来,您就可以隐藏有关图像源的所有信息,包括用户ID,但缺点是要求所有数据都必须通过服务。
  • 重新检查您的要求。 “简化开发人员方面的搜索”可能没有您想像的那么重要,您需要从中受益,而不是解决该问题的成本。

答案 1 :(得分:0)

AppEngine上还有Google Images API个可用选项。您可以将Cloud Storage对象与Google Images API链接,并使用此API的好处-安全的URL,使用URL参数转换和调整图像大小。 您只需要为存储在GCS中的每张图片准备servingURL,并保留此服务网址(例如,在Google Datastore中)

ImagesService imagesService = ImagesServiceFactory.getImagesService();
ServingUrlOptions suo = ServingUrlOptions.Builder
    .withGoogleStorageFileName(gcsImageObjectPath)
    .secureUrl(true);
String servingUrl = imagesService.getServingUrl(suo);

答案 2 :(得分:-1)

您要发布的URL类型:

https://storage.cloud.google.com/[BUCKET_NAME]/[OBJECT_NAME]

仅用于accessing the bucket or the object directly in a browser throught the Cloud Console

当应用程序要访问对象时,大多数情况下does an HTTP GET request可以访问:

https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]/o/[OBJECT_NAME]

或者它使用Cloud Storage client library

我认为良好的应用程序设计不应让用户猜测正在调用的URL或URL模式以及存储桶或对象名称。但无论如何,强烈建议您遵循Best Practices for Google Cloud Storage

  

请勿在存储桶名称中使用用户ID,电子邮件地址,项目名称,项目编号或任何个人身份信息(PII),因为任何人都可以探测到存储桶的存在。同样,将PII放在对象名称中时要非常小心,因为对象名称会出现在对象的URL中。

还可以猜出存储桶名称的任何用户都无法确定USER_ID的存在,或者如果未向其提供right permissions来阻止他们的请求,访问存储桶。