Приложение Facebook Iframe с несколькими страницами в сеансах сеанса Safari не сохраняется

У меня есть приложение iframe facebook с несколькими страницами PHP в нем.

У меня есть некоторые ссылки, которые указывают относительно файлов внутри моей "папки iframe".

Наличие некоторых проблем с переменными сеанса внутри iframe. Я устанавливаю некоторые переменные сеанса, но они не сохраняются с одной страницы на другую.

Это работает в других браузерах.

Я читал, что Safari не поддерживает файлы с несколькими доменами, и это может быть проблемой, но я не уверен, как это исправить.

Любая помощь?

Ответы

Ответ 1

Я написал сообщение в блоге Доминик ссылается в своем ответе.

Проблема в том, что поведение Safari по умолчанию заключается только в том, чтобы принимать файлы cookie только с сайтов, которые вы посещаете. Это исключает "сторонние" файлы cookie. Safari рассматривает страницу внутри IFRAME как сторонний сайт, и пока вы не взаимодействуете с этим контентом (например, нажав ссылку), он откажется от этих файлов cookie.

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

Мое решение - сохранить все специальные параметры Facebook до второй страницы, загруженной в IFRAME. Поскольку вы взаимодействовали с ним, файлы cookie, установленные на второй странице, будут сохраняться, и это позволит вашему PHP-коду сохранять любое состояние, необходимое для связи с Facebook.

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

Ответ 2

Я считаю, что это решение стало устаревшим с последними (6.0 и более поздними) версиями Safari.

Safari по умолчанию не позволяет устанавливать файлы cookie от третьих лиц. Это влияет на приложения iframe Facebook, поскольку пользователь обращается к странице, обслуживаемой с apps.facebook.com, но iframe в этом случае обслуживается от yourdomain.com, "третьей стороны".

В Интернете существует несколько решений. Лучшее, что я нашел, и рекомендованное Facebook в его списке разные вопросы, - это подделка запроса POST на yourdomain.com с помощью JQuery. Это решение, подробно описанное Anant Garg работает в целом для разных доменов host/iframe и должно быть адаптировано для приложений Facebook. Ключевыми частями являются:

$("body").append('
 <iframe id="sessionframe" name="sessionframe" onload="submitSessionForm()" src="http://www.yourdomain.com/blank.php" style="display:none;"></iframe>
 <form id="sessionform" enctype="application/x-www-form-urlencoded" 
   action="http://www.yourdomain.com/startsession.php"
   target="sessionframe" method="post"></form>');
var firstTimeSession = 0;
function submitSessionForm() {
  if (firstTimeSession == 0) {
    firstTimeSession = 1;
    $("#sessionform").submit();
  }
}

Другое решение Will Henderson - использовать каждую ссылку на вашей странице с информацией о сеансе, используя функцию Javascript. Затем измените код сервера, чтобы получить информацию о сеансе, прочитав его из параметров GET.

Ответ 3

Я думаю, что лучшим решением является ручное отслеживание идентификатора сеанса, т.е. с помощью session_id($_GET['session]); Просто убедитесь, что вы делаете это, прежде чем звонить session_start();, и все работает.

Ответ 4

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

Например, если abc.php является вашей целевой страницей, а URL холста - facebook.com/abc. Сначала перенаправляйте запрос от abc.php на другую страницу, например xyz.php, затем перенаправляйте снова с xyz.php на facebook.com/abc. Не забудьте запустить сеанс в xyz.php.

Это простое исправление...

Ответ 5

и спасибо за все входные данные. Я решил решить проблему, добавив параметр "signed_request" на каждую страницу. Я просто поместил его в скрытое поле и установил его в коде. Таким образом мне удалось заставить его работать в Safari. Надеюсь, это сработает и для вас.

Ответ 6

Если вы используете .NET, тогда есть гораздо более простое решение этой проблемы.

Просто установите cookieless в false в вашем web.config. Пример:

sessionState mode="InProc" cookieless="true" timeout="60" 

Это намного проще, чем публикация iframe или открытие всплывающего окна с URL-адресом iframe.

С уважением,

Дэвид

Ответ 7

С выпуском Safari 7 блокируется не только сторонний cookie. Локальное хранилище, а также WebDB блокируются любые данные веб-сайта. Когда вы переходите к настройкам Safari (запятая CMD +), на вкладке "Безопасность" на Safari 7 теперь говорится: "Блокировать файлы cookie и другой сайт", изначально было "Блокировать файлы cookie". Это подтверждает изменения.

В будущем могут просматриваться и другие браузеры. Скорее всего, Firefox. Хром, кашель * кашель *, вероятно, нет.

Вам, вероятно, придется использовать некоторое обходное решение, используя метод перенаправления или всплывающее окно, похожее на то, что сделал disqus.

Ответ 8

Я использовал этот заголовок с PHP, который исправил мои проблемы

if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ) header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');