私有内容CORS与S3有关

Jos*_*exy 10 amazon-s3 amazon-web-services cors

问题

我一直在试图浏览围绕AWS生态系统的许多3个字母的缩写词服务.

我要做的是在网站上显示内容(pdf,图像,视频),其中该内容只能在网站上显示给经过身份验证的用户,而不能下载或公开访问.

我的问题是,无论我尝试什么,不允许完全公开访问存储桶,在从前端请求图像内容时给出403错误.

该应用程序的体系结构是一个前端JS应用程序,通过在S3上托管的CloudFront分发服务.这与EC2上托管的后端进行通信.

到目前为止我尝试过的

CORS配置

关于该主题的文档似乎暗示简单地创建CORS规则以允许从我的网站访问存储桶中的对象.

我创建了一个CORS策略,类似于桶的以下内容,它应允许访问存储桶中的对象:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://*.websitename.com</AllowedOrigin>
    <AllowedOrigin>https://*.websitename.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

这里没有运气,403错误.作为测试它是否可能不是CORS配置的测试,我打开了CORS策略以尝试允许公共CORS访问存储桶,如下所示:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

这里没有运气,stackoverflow上的其他人提到有一个记录的问题AllowedOrigin: *,并尝试以下:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>http://*</AllowedOrigin>
    <AllowedOrigin>https://*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

一个用户指出stackoverflow,Origin默认情况下直接链接的内容不发送标头,这意味着S3会将其解释为内部请求并发送403禁止错误.对此的解决方案是添加crossorigin="anonymous"到图像标记.

将此属性添加到img标记后,将确认标题已正确发送.它正在Origin: mywebsitename.com请求标题中发送正确的,我甚至收到response包括我的网站在内的允许来源的正确标题.

Cloudfront分发问题

根据答案,默认情况下,cloudfront不会将标头转发到S3.我已经采取了转发所有标头的步骤,包括Access-Control-Allow-MethodsAccess-Control-Allow-Origin.

此外,另一个人认为,云端偶尔会出现奇怪的缓存问题.我也在图像中添加了一个随机查询字符串,结果相同.

两者之后,仍然是403.

对于整个设置,我有点在绳索的最后,我正在考虑其他选项,如后端的代理服务器,我自己处理授权.虽然允许所有来源并不是我的最终目标,但它应该在这一点上起作用.有没有人有任何想法?

小智 1

content can only be displayed on the website to authenticated users and not be downloaded or publicly accessible

您的 CF 或 S3 将所有内容视为未经身份验证。将您的 S3 配置为允许来自 CF 的所有请求,并尝试使用 Lambda@Edge 检查身份验证并允许或拒绝该请求。另一种选择是使用 S3 的签名 URL,但这涉及更多工作。