【问题标题】:JavaScript : Hosting User Images in S3 Bucket For ApplicationJavaScript:在 S3 存储桶中为应用程序托管用户图像
【发布时间】:2016-02-03 05:31:09
【问题描述】:

背景”深入概述了问题 - 我添加它是为了使这个问题成为使用 S3 托管图像(如个人资料图像)的良好指南

您可以直接跳到“我遇到麻烦”以直接提供帮助。

----------------------------------------------- 背景------------------------------------------ ---------------------- 注意:请随意批评我对如何为未来的读者正确托管图片的假设。

因此,对于快速原型,我将用户头像图像托管在 AWS S3 存储桶中,但 我想大致模拟它在生产中的完成方式。

以下是我对如何为行业标准图像托管建模的 3 个假设。(基于我研究过的非网站):

  1. 阅读 - 您可以使用公共端点(无需令牌)
  2. 保护阅读访问权限 - 使用散列来存储资源(图像)。应用程序会将散列后的 URL 提供给具有访问权限的用户。

    例如 2 个哈希值(1 个用于文件路径,1 个用于图像): https://myapp.com/images/1024523452345233232000/f567457645674242455c32cbc7.jpg

    ^上述可以通过 S3 使用散列的“前缀”和散列的文件名来完成。

  3. 写入权限 - 用户应登录应用并获得临时凭据以写入存储(即添加图像)。

所以有了这 3 个假设,这就是我正在做的事情和问题:

(简单的编写 - 使用凭据)

<script type="text/javascript">
  AWS.config.credentials = ...;
  AWS.config.region = 'us-west-2';
  var bucket = new AWS.S3({params: {Bucket: 'myBucket'}});
  ...
  var params = {Key: file.name, ContentType: file.type, Body: file};
      bucket.upload(params, function (err, data) {
        //Do Something Amazing!!
  });
</script>

---------------------------------我遇到了麻烦- -------------------------------------------------- --------(A Simple Read -Give The User a Signed URL) Error 403 Permissions

<script type="text/javascript">
      AWS.config.credentials..
      AWS.config.region = 'us-west-2';
      var s3 = new AWS.S3();
      var params = {Bucket: 'myBucket', Key: 'myKey.jpg'};
      document.addEventListener('DOMContentLoaded', function () {
          s3.getSignedUrl('getObject', params, function (err, url) {
            // Getting a 403 Permissions Error!!!
          });
      });
</script>

我认为不需要签名的 URL,但我认为它可以解决权限错误,但 我必须手动将权限设置为公开才能读取图像。

问题:

  • 那么我应该如何让那些已经获得 URL 访问权限的端点完全公开(可读),但只有在用户拥有凭据时才可写?

【问题讨论】:

  • 您不应该使用哈希值来保护安全,而是使用预签名的 GET url。您的文件要么是公开的,要么是私有的。您可以使用预签名 URL 为经过身份验证的用户授予对私有对象的访问权限。如果您想允许用户从浏览器直接上传到 S3,您可以使用预签名的 POST url。
  • @KrishnaSrinivas 我本质上是想让它们公开。例如,我注意到必须社交媒体应用程序,一旦将 url 提供给用户,他们就可以从任何设备打开它(这让我假设没有涉及访问的令牌)。然而,照片本身有散列名称。
  • 不,应用程序不会使用哈希值来保证安全性,它们会使用哈希值作为文件名,只是为了使其唯一。您可以检查私人 Facebook 照片的 URL,您可以看到图像名称看起来像一个哈希,后跟一个签名。任何拥有图像名称和签名的人都可以访问该图像。签名还可能包含到期时间(不确定 facebook 如何实现它)。添加到 URL 的签名是应用程序保护图像或其他文件的一般方式。

标签: javascript security amazon-web-services amazon-s3 http-status-code-403


【解决方案1】:

要在上传对象时使其可公开下载,请将名为“public-read”的预制(预定义)ACL 与 putObject 请求一起应用。

var params = {
  Key: file.name, 
  ContentType: file.type, 
  Body: file,
  ACL: 'public-read'
};

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

【讨论】:

  • 当我将 ACL: 'public-read' 添加到参数时,我现在得到“加载资源失败:服务器响应状态为 403(禁止)”时试着写。
  • 但是如果你省略这个,你可以成功上传对象吗?
  • 是的,它正在上传,但我上传的内容我无法阅读(我阅读了上述方式)。我得到错误 403 权限。我希望任何用户都可以公开阅读所写的任何内容。(我正在使用散列来保护图像)。
  • 您在存储桶或 IAM 用户策略中授予了哪些权限?如果只有s3:putObject,你可能还需要s3:putObjectAcldocs.aws.amazon.com/AmazonS3/latest/dev/…
  • 在存储桶的权限下,我设置了 Grantee:Everyone , List:checked Upload/Delete:Checked ViewPermissions:Checked EditPermissions:Checked。然而,如果不将图像本身设置为公开,则 IAM 用户无法读取上传的图像。
猜你喜欢
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多