Здравствуй, уважаемый читатель! Перед тобой когда-нибудь стоял вопрос о том, что хуже - Facebook или Safari? Эта статья о том, как сравнить социальную сеть и браузер :) В последнее время есть две такие жутко модные моды - Макбук и Фейсбук. Оказывается, если смешать их, получится гремучая смесь. Сафари, этакий IE для OS X, не принимает cookies в iframe. Не хочет. А это значит, что при создании iframe-приложений у нас может возникнуть проблемка.
Строго говоря, Safari абсолютно намеренно так поступает. Это такой способ защиты пользователя от сбора информации о нём - пока человек просматривает один сайт, его браузер не должен отправлять информацию об этом другим сайтам. Звучит логично и, если бы ещё такая защита не ломала целую гору уже существующих сервисов, где подобная передача данных просто необходима, цены бы ей не было! Блокировку куков в Сафари можно отключить, но не станешь ведь каждому пользователю выводить инструкцию вместо приложения.
Почему же плох Facebook? Да потому, что никак не учитывает такой нехорошей подставы в своём SDK, обрекая разработчиков на долгие поиски "своих косяков", когда важный дядя-заказчик со своего ультратонкого Macbook Pro зайдёт через супербыстрый Safari в новоиспечённое приложение. А ведь решение есть! Вот оно, собственно:
/*
* Финт ушами для корректной работы авторизации Safari в iframe-приложении Facebook.
* Этот код нужно поместить в точку входа приложения, чтобы он выполнялся один раз.
* Редиректит браузер на страницу без iframe, стартует сессию и редиректит обратно :)
* Куки? Нет-нет, что Вы! Редиректнуться? Конечно, хоть сейчас!
*/
// Если сессия уже открыта, эта строка будет ругаться - удалить её
session_start();
// В эту переменную нужно положить адрес приложения в соцсети
$page_url = "https://apps.facebook.com/your_application/";
if (isset($_GET["start_session"])) {
die(header("Location:" . $page_url));
}
$sid = session_id();
if (!isset($_GET["sid"])) {
if(isset($_POST["signed_request"])) {
$_SESSION["signed_request"] = $_POST["signed_request"];
}
die(header("Location:?sid=" . $sid));
}
if (empty($sid) || $_GET["sid"] != $sid) {
die('<script>top.window.location="?start_session=true";</script>');
}
Если после вставки этого финта всё сломалось, советую проверить пару вещей:
- Убедиться, что комментарии в коде прочитаны и осознаны :)
- Убедиться, что этот код вставлен именно в точку открытия приложения, посмотреть js консоль. Возможно, он выполняется при каких-то ajax запросах и производит редирект с потерей POST параметров.
Так что же хуже? Facebook или Safari? Приятной отладки!