【发布时间】:2017-12-05 12:22:05
【问题描述】:
我的应用程序正在显示存储在 AWS S3 中的图像(出于安全原因,在私有存储桶中)。
为了让用户从他们的浏览器中查看图像,我生成了 签名 URL,例如 https://s3.eu-central-1.amazonaws.com/my.bucket/stuff/images/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...&X-Amz-Date=20170701T195504Z&X-Amz-Expires=900&X-Amz-Signature=bbe277...3358e8&X-Amz-SignedHeaders=host。
这与<img src="S3URL" /> 完美配合:图像显示正确。
我什至可以通过复制/粘贴 URL 来直接在另一个选项卡中查看图像。
我还在生成嵌入这些图像的 PDF,这些图像需要在之前使用 canvas: 调整大小和水印进行转换。
但是我用来调整大小的库有一些问题:
Failed to execute 'getImageData' on 'CanvasRenderingContext2D':
The canvas has been tainted by cross-origin data.
确实,我们处于 CORS 上下文中,但我已经设置了所有内容,以便可以向用户显示图像并且确实可以正常工作。
所以我不确定这个错误的原因:这是另一个 CORS 安全层:浏览器担心我可能会出于恶意目的更改图像?
我尝试在 S3 存储桶上设置一个允许的 CORS 配置:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
而img.crossOrigin = "" 或img.crossOrigin = "Anonymous" 在客户端,然后我得到:
Access to Image at 'https://s3.eu-central-1.amazonaws.com/...'
from origin 'http://localhost:5000' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:5000' is therefore not allowed access.
可能缺少哪些 AWS/S3 端和/或客户端配置?
【问题讨论】:
-
两件事:临时修改S3中的对象,给对象添加
Cache-Control: no-cache。 S3 和 Chrome 存在一个问题,如果您从 HTML<img>访问相同的 S3 对象并在 CORS 上下文中单独访问,Chrome 似乎不会做正确的事情。然后清除浏览器缓存并查看它的行为,看看这是否确实相关。此外,使用http://lvh.me:5000而不是 localhost 访问您的测试站点,以查看img.crossOrigin的行为是否有任何不同。 -
感谢您的回答迈克尔。确实禁用缓存似乎可以解决问题。我通过切换每个图像
Cache-Control属性进行了一些测试,结果是一致的:Cache-Control的图像可以使用画布进行转换。您能否在专门的答案中详细说明该问题,以便我接受。非常感谢您的出色帮助,我永远不会这样做。 :-)
标签: image amazon-web-services canvas amazon-s3 cors