CORS с Amazon S3 и Cloudfront

У меня есть приложение Rails, размещенное на Heroku, которое использует CloudFront с активами, размещенными на S3.

Он отображает активы с префектом (хотя это заняло некоторую борьбу).

Моя настройка для Cloudfront:

Forward Headers: Whitelist
Whitelist Headers: Origin
Forward Query Strings: No

Настройка CORS для ковша S3:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

JS, который вызывает изображение (кофе)

@mousemove (e) ->
  ctx = $("<canvas>").attr(
    width: @width
    height: @height
  )[0].getContext("2d")

  ctx.drawImage(this, 0, 0, @width, @height)

  # This is because firefox doesn't support offset[X|Y]
  if(e.offsetX == undefined)
    xpos = e.pageX - $(this).offset().left;
    ypos = e.pageY - $(this).offset().top;
  else
    xpos = e.offsetX;
    ypos = e.offsetY;

  e.rgb = ctx.getImageData(xpos, ypos, 1, 1).data
  return f.call this, e

Это ошибки с:Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.

Скручивание запроса:

curl -i -H "Origin: http://example.com/" http://randomness.cloudfront.net/franchisees/logos/000/000/006/icon/Screen_Shot_2014-08-06_at_15.21.14.png?1407334881

  Response:
  HTTP/1.1 200 OK
  Content-Type: image/png
  Content-Length: 6888
  Connection: keep-alive
  Date: Wed, 06 Aug 2014 16:15:54 GMT
  Access-Control-Allow-Origin: *
  Access-Control-Allow-Methods: GET, HEAD
  Last-Modified: Wed, 06 Aug 2014 14:21:23 GMT
  ETag: "6f266467cf0a570526869bcf280da412"
  Accept-Ranges: bytes
  Server: AmazonS3
  Age: 21
  Vary: Origin
  X-Cache: Hit from cloudfront
  Via: 1.1 16d4ae36524b457e558b982004526450.cloudfront.net (CloudFront)
  X-Amz-Cf-Id: 5Vm_eCn_lTOHEMzPEcmtCGYCUdOZ2r_9R4W6mEPTOPFUIJe0ilMP7g==

 *snip*

Это не проблема кеширования. Я использую свежие изображения каждый раз, хотя этот запрос был в кешированной версии.

Я знаю, что есть обходные пути, но мне бы очень хотелось, чтобы это работало таким образом.

Что мне здесь не хватает?

1 ответ

Решение

Проблема в том, что по умолчанию браузер не будет проверять эти заголовки cors - все извлеченные изображения грязные. Чтобы ваши заголовки cors могли делать все, что вам нужно, установите crossorigin атрибут на IMG, так что вы получите изображение с поддержкой Cors.

<img src="blah" crossorigin="anonymous" />

Атрибут crossorigin может принимать значения anonymous или же use-credentials, Это аналогично withCredentials опция при создании междоменных запросов ajax: по умолчанию файлы cookie, http auth и т. д. отправляться не будут. Если вы создаете изображение в JavaScript, соответствующее свойство crossOrigin,

Согласно документации MDN, Chrome, Firefox и IE 11 поддерживают это, но выпущенные версии Opera или Safari не поддерживают

Другие вопросы по тегам