2015-03-20 2 views
2

Мы недавно закончили создание курса электронного обучения для клиента и планируем вскоре его развернуть. У них есть свой собственный веб-сервер со своим доменом, но мы хотели бы, чтобы мы провели хостинг курса на нашей LMS, работающей на Rails, на нашем сервере.Междоменный iframe вызывает проблемы с куки-файлами (Rails)

Курс довольно длинный, поэтому для его приостановки и возобновления требуется регистрация в любое время.

Теперь они также хотели бы, чтобы пользователи посетили свой домен, foo.com, перемещались и запускали курс. Затем страница запуска программы включает нашу страницу в iframe, начиная с app.bar.com.

Это, конечно, вызывает некоторые проблемы с сеансом из-за сторонних файлов cookie и так далее. Я исследовал и нашел множество разных хаков и решений, но пока ничего не получилось.

  1. P3P -header, как я понимаю, это на самом деле не используется больше, но я добавил фиктивный заголовок, похожий на Facebook и Google. (P3P: CP="This site does not have a p3p policy.")

  2. Я также изучал CORS, с Access-Control-Allow-Credentials: true, который звучал многообещающе, но ничего не сделал. Возможно, я неправильно сконфигурировал его, но хотел бы знать, возможно ли это, прежде чем инвестировать слишком много времени.

  3. Некоторые сайты упоминают, что это работает, если браузер пообщалась с app.bar.com ранее, поэтому я попытался загрузки изображения из app.bar.com до фрейма, но это было либо недостаточно, либо еще один хак, который позже была исправлена.

Я понимаю, что блокирование сторонних файлов cookie обычно является хорошей вещью для предотвращения отслеживания пользователей. Люди, которые должны пройти курс, поступают со всего мира, и объяснение того, как отключить блокировку файлов cookie сторонних производителей для каждого из них, не является вариантом.

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

Нет необходимости в каком-либо обмене данными между доменами, как полагают большинство других решений JavaScript, за исключением того, что файлы cookie установлены и отправлены на нашу LMS.

У меня есть полный контроль над нашим сервером и при необходимости можно изменить в основном все, что есть. Для клиентского сервера у меня ограниченный доступ к HTML.

EDIT: Только что заметил, что в IE9 по крайней мере он отлично работает с P3P-заголовком.

+0

У меня подобный выпуск. Если я смогу захватить POST без cookie и поделиться ссылкой, чтобы отобразить форму в окне прямо на моем сайте, то это сработает для меня ... (http://stackoverflow.com/questions/29311728/ show-error-message-after-form-post-if-client-browser-doesnt-send-cookie) – user1322092

ответ

3

Самый безопасный способ - это запустить приложение в субдомене домена ваших клиентов, т.е. course.foo.com.

P3P никогда не получал большого признания; «сначала связываться с сайтом», как вы ссылаетесь на 3), вероятно, относится к Safari loophole that has since been closed.

CORS не применяется в вашем случае. Было бы уместно, если бы вы хотели взаимодействовать с родительским кадром клиентов с сайтом курса, например.делать запросы AJAX или загружать ресурсы, такие как шрифты.

Так что, если вы хотите пользовательские агенты для лечения печенья в качестве первой партии печенья,

  1. хоста-сайт на course.foo.com
  2. изменения настроек в config/initializers/session_store.rb для

    Rails.application.config.session_store :cookie_store, 
                 key: '_course_session', 
                 domain: 'foo.com' 
    

По умолчанию Rails установит домен cookie на course.foo.com, что отличается от foo.com. Но обратное работает - установив домен cookie только foo.com, он доступен для того же источника, что и для каждого поддомена, такого как www.foo.com или course.foo.com.

Существует одно потенциальное соображение безопасности, хотя: ваши куки-приложения для вашего курса теперь доступны и для существующего сайта ваших клиентов, поэтому проблема безопасности теперь может также скомпрометировать ваши cookie сеансов приложений.

+1

Я считаю, что вы действительно хотите установить домен в '. .foo.com.'. В противном случае его следует рассматривать как полное имя и cookie не следует отправлять. –

+1

@DavidHoelzer, который был изменен с помощью [RFC 6295] (http://tools.ietf.org/html/rfc6265#section-4.1.2.3): _ Обратите внимание, что ведущий% x2E ("."), Если он присутствует, игнорируется даже если этот символ не разрешен. Домены без ведущих точек применяются к субдоменам - в значительной степени IE обрабатывает его с самого начала. – janfoeh

+0

Спасибо! Я пропустил это изменение! –

0

Вы добавили следующие заголовки на другом домене:

'Access-Control-Allow-Origin:*' 

или Idealy установить только домен источника. Если вы читаете мой комментарий, кажется, что вы хотите передать переменные хранящиеся в куки, так почему бы не использовать шифрование, основанный на уникальном ключе пользователя и передавать данные через GET:

<iframe src="http://mywebsite.com?user_id=[id]&user_data=[encrypted_data_goeshere]"> 

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

+0

С какой стороны следует добавить? У меня нет возможности изменять заголовки, которые отправляет клиент, только на нашей стороне ... – PerfectlyNormal

+0

Это должен быть заголовок сервера вашего сайта, когда он загружается в ваш iframe клиентов, а также в любых запросах Ajax/JS. Но забудьте об этом, вы все это делаете неправильно. Объясните мне, что именно нужно передавать между доменами, cookie сеанса на его сайте не имеет никакого значения на вашем сервере, поэтому вы пытаетесь передать переменную, которая хранится в сеансах? Это не имеет ничего общего с политикой одного происхождения. Сеанс хранится на стороне сервера, и есть только cookie, который действует как уникальный идентификатор, чтобы просмотреть его. Фактические данные не сохраняются в файлах cookie! – Neo

+0

Между доменами ничего не требуется. Содержащая страница (размещенная клиентом) является просто немым статическим HTML-контейнером, а содержимое iframe (размещенное нами) содержит панель запуска курса и бит входа. Проблема заключается в том, что если посетители заполняют форму знака в iframe, наш сервер отправляет заголовок, чтобы установить cookie с идентификатором сеанса, но посещающий браузер отказывается отправить его при загрузке новых страниц в iframe, поэтому оставаясь подписанным в не работает. – PerfectlyNormal

Смежные вопросы