Написание Flash crossdomain.xml для Amazon S3

У меня есть два сервера. Сервер А - это внутренний сервер, доступ к которому есть из внешнего мира, установленного здесь, в моем офисе. На нем запущен сервер Rails. У меня есть второй сервер, сервер B, который содержит весь наш статический контент (изображения, swfs, javascript, css и т. Д.), Это сервер Amazon S3. Я дал всем этим файлам публичный доступ.

Я пытаюсь поместить SWF-файл с сервера B на страницу, обслуживаемую сервером A. Затем другие ресурсы, которые требуются swf для отображения, динамически загружаются с сервера B. К сожалению, однако, где-то по пути это не удается и файлы, которые запрашиваются для динамической загрузки, просто не приходят.

Исходя из ошибок в консоли браузера, SWF ожидает, что файл crossdomain.xml будет находиться на сервере А. На этом основании он также должен находиться на моем сервере S3. Итак, в этом случае я создал два файла crossdomain.xml, по одному для каждого сервера.

Это файл crossdomain.xml сервера A:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE cross-domain-policy SYSTEM
  "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="s3-bucket-name.s3.amazonaws.com" />
</cross-domain-policy>

Это файл crossdomain.xml сервера B:

<?xml version="1.0" encoding="UTF-8"?>    
<!DOCTYPE cross-domain-policy SYSTEM
  "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <site-control permitted-cross-domain-policies="master-only"/>
  <allow-access-from domain="*.server-a.com"/>
  <allow-http-request-headers-from domain="*.server-a.com" headers="SOAPAction"/>
</cross-domain-policy>

Кроме того, я явно загружаю файл crossdomain.xml сервера B в свой swf:

Security.loadPolicyFile("https://s3-bucket-name.s3.amazonaws.com/crossdomain.xml");

Независимо от того, что я делаю, однако, это просто не работает. Я не уверен, что еще попробовать. Я попытался просмотреть несколько решений здесь, но ничего не помогло мне решить мою проблему. Конечно, у кого-то еще было больше опыта в этом, чем у меня, и он может дать мне некоторое руководство, у меня довольно много идей на данный момент.

Обновление Обновление моего вопроса с дополнительной информацией.

Я попытался установить оба файла политики на *, и он начал работать, пока не нажал:

SecurityError: Error #2121: Security sandbox violation: Loader.content: s3.amazonaws.com/bucket_name/swfs/foo.swf cannot access s3.amazonaws.com/bucket_name/data/swfs/bar.swf. This may be worked around by calling Security.allowDomain.

Кроме того, я запустил Чарльза, и он получает файл crossdomain.xml с моего локального сервера, но я не вижу его для s3.

Обновление 2 Я попытался добавить это в загрузчик:

var context:LoaderContext = new LoaderContext();
context.securityDomain = SecurityDomain.currentDomain;
context.applicationDomain = ApplicationDomain.currentDomain;
Loader.load(new URLRequest(_dataFile), context);

Это привело к загрузке файлов! К сожалению теперь это вылетает с этим:

SecurityError: Error #2119: Security sandbox violation: caller s3.amazonaws.com/bucket_name/swfs/MainSwf.swf cannot access LoaderInfo.applicationDomain owned by s3.amazonaws.com/bucket_name/data/swfs/foo/SecondSwf.swf

Я пытался включить / не включая context.applicationDomain = ApplicationDomain.currentDomain; линия, но это не решило проблему.

Место, где происходит сбой, происходит позже, после загрузки файла, когда мы получаем домен приложения: loader_.contentLoaderInfo.applicationDomain.getDefinition( def.a )

3 ответа

Решение

Похоже, у вас есть a.swf и b.swf на разных доменах, и a.swf пытается получить доступ к содержимому b.swf (через Loader.content), и, без сомнения, это приводит к ошибке безопасности.

У вас есть два варианта:

  1. Загрузите b.swf в тот же домен безопасности, что и a.swf (т. Е. "Текущий" домен безопасности). Вы можете сделать это в коде.swf, передав новый LoaderContext в Loader.load() и настройка loaderContext.securityDomain = SecurityDomain.currentDomain

  2. Простота позволяет a.swf получить доступ к b.swf, вызвав Security.allowDomain() в коде b.swf с именем домена a.swf в качестве параметра

Какой из них вы выберете, зависит от других соображений. С первым b.swf может делать то, что может делать a.swf (все!) С точки зрения междоменной безопасности (например, доступ к файлам и т. Д.); со вторым любой SWF-файл в домене a.swf может получить доступ к содержимому b.swf. Это действительно зависит от того, как вы хотите установить доверие.

Убедитесь, что mime-тип файла crossdomain.xml имеет значение application/xml, Flash не будет загружать файл политики, если тип mime установлен неправильно. Оформить заказ на бесплатный клиент s3 CloudBerry, он довольно хорош при обнаружении / установке правильного mimetype, возможно, используемый вами клиент s3 неправильно его установил.

Редактировать: Apache и другие веб-серверы обнаруживают тип MIME файла и возвращают его в заголовках ответов - поэтому эта проблема обычно не возникает при локальном тестировании

Решено, наконец. Убедитесь, что вы используете имя сегмента в качестве субдомена как для загрузки файла политики, так и для каждого запроса файла / URL.

Решение:

http://onegiantmedia.com/cross-domain-policy-issues-with-flash-loading-remote-data-from-amazon-s3-cloud-storage

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