Сеансы Safari и php не работают в facebook iframe
У меня возникла проблема с подключением моего приложения facebook к Safari.
Проблема связана с переменными сеанса PHP.
Я знаю, что у Safari есть проблема, связанная с сеансами кросс-домена (внутри iframe), и я нашел около двух типов решений:
- Настройка заголовка p3p: я пробовал много заголовков p3p, но ни один из них не работал [например:
header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');
].
- Отправка сообщения в iframe, используя javascript. Это создает взаимодействие, и сеансы должны работать. Но факт в том, что я не контролирую контейнер iframe, так как это facebook.
Кто-нибудь знает альтернативное решение?
Спасибо!
Ответы
Ответ 1
РЕДАКТИРОВАТЬ: Подтверждено, это обходное решение больше не работает в Safari 5.1 на Mac. Обсуждаемое здесь: Safari 3rd party cookie iframe trick больше не работает?
Я не знаю, что ваш вариант использования, но в нашем приложении у нас есть экран приветствия с кнопкой "Разрешить доступ", которая открывает диалог разрешений. Когда пользователь нажимает "Разрешить доступ", я использую его для открытия нового окна, которое устанавливает сеанс и немедленно закрывается (это было предложено в вопросе, указанном выше). После того, как пользователь разрешил доступ, вы можете просто перезагрузить страницу? В нашем случае это не нужно, так как вся связь с сервером выполняется с помощью ajax.
Я использую второе решение и не имею никаких проблем с этим, здесь мой код (с помощью jQuery):
/**
* Hack for Safari cross-domain cookies. See:
* http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/
*/
$(document).ready( function() {
var isSafari = (/Safari/.test(navigator.userAgent));
if (isSafari) {
var iframe = $( "<iframe />" );
iframe.attr( "id", "cookieframe" );
iframe.attr( "name", "cookieframe" );
iframe.hide();
var form = $( "<form />" );
form.attr( "id", "cookieform" );
form.attr( "target", "cookieframe" );
form.attr( "enctype", "application/x-www-form-urlencoded" );
form.attr( "action", "startsession.php" );
form.attr( "method", "post" );
$("body").append( iframe );
$("body").append( form );
form.submit();
}
} );
В startession.php я только начинаю сеанс:
<?php session_start();
Ответ 2
Я опаздываю на это, но это может помочь кому-то еще решить эту проблему.
Единственным способом, который я мог бы сделать, было обнаружение сафари изнутри моего iframe и мгновенное перенаправление на другую страницу, где я мог установить свой cookie сеанса, а затем перенаправить обратно.
<?php
// sort out ie with the below header
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
session_start();
$_SESSION = array();
// if Safari and no cookies have been set yet, take me to another page to set a session cookie
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) {
if (count($_COOKIE) === 0) {
echo '<script>
top.location = "http://www.domain.com/setcookie.php";
</script>';
}
}
?>
Затем из setcookie.php
<?php
//inside setcookie.php
header('P3P: CP="CAO PSA OUR"');
session_start();
$_SESSION = array();
echo
'<script>
top.location = "http://www.backtooriginaldomain.com";
</script>';
?>
его немного хромает, но работает и не мешает другим браузерам. Другой метод - использовать всплывающее окно, хотя по умолчанию мой сафари заблокировал его.
Ответ 3
далеко не самое приятное решение, но вам не нужны дополнительные страницы
положите решение в первую позицию на своей странице, чтобы вы видели только мерцание белого цвета.
<?php
if (isset($_GET['safarifix'])) {
session_start();
echo '<script type="text/javascript">top.location = \''.$_GET['safarifix'].'\'</script>';
exit();
}
if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
header('P3P: CP="CAO PSA OUR"');
echo '<script type="text/javascript">top.location = document.URL + "?safarifix=" + encodeURIComponent(document.referrer)</script>';
exit();
}
?>
отправьте свой ссылочный url на страницу, где вы действительно делаете свой материал.
ничего не нужно.
затем вернитесь на страницу, на которой вы были в первую очередь.