Я в настоящее время разрабатываю сайт, который работает автономно и как приложение facebook в iframe. Мне было интересно, что, как бы лучше всего, проверяли, была ли моя страница запущена в faceram iframe до загрузки страницы, поэтому я могу задать соответствующий CSS и другие переменные
Благодарю.
Есть несколько способов приблизиться к этому. Если вас не беспокоит безопасность (т. Е. Вы действительно хотите знать, как отформатировать страницу, а не решать, какой контент показывать), то лучшим вариантом может быть использование отдельного URL-адреса для доступа к Facebook. Например, если ваш автономный сайт http://www.mysite.com, вы можете настроить fb.mysite.com или http://www.mysite.com/fb, чтобы указать на то же место, а затем использовать альтернативную версию в настройках вашего приложения. Затем ваш код сервера может легко проверить, к какой версии URL-адреса обращаются и действуют соответственно. Конечно, вы должны заботиться о своих ссылках, чтобы убедиться, что они поддерживают правильный префикс.
Другим способом является использование signed_request, как обсуждалось, установка cookie (или сеанса), когда он присутствует, чтобы указать доступ к Facebook. Хитрость там также включает в себя немного кода JavaScript в верхней части каждой страницы, которая проверяет, чтобы страница находилась в пределах iframe. Если нет, тогда код немедленно перенаправляет обратно на текущую страницу с параметром, добавленным как «? Clearfb = 1», который сообщает серверу очистить файл cookie / сеанс и выводит страницу во внешнем формате.
$signed_request = $_POST['signed_request']; if(empty($signed_request)) die('No direct access.');
проверка наличия присутствия signed_request также будет хорошим тестом …
Вот несколько PHP-кода для проверки, работает ли текущая страница внутри фреймбэка iframe:
if( strpos( $_SERVER[ 'HTTP_REFERER' ], "apps.facebook.com" ) !== false ){ // Page is running in Facebook iframe }
Единственная реальная проверка для этого может быть выполнена на стороне клиента путем сравнения window.top==window
если оно истинно. Приложение выполняется за пределами iframe
.
Нет проверки на стороне сервера, которая может гарантировать это, поскольку браузеры не передают информацию о родительских кадрах на сервер, отличный от HTTP_REFERRER, которому нельзя доверять.
Facebook, проходящий signed_request к вашему приложению, если работает на холсте холста страницы, но это не то, что вы можете полностью доверять, так как оно может быть имитировано пользователем.
Обновление :
Утверждение, что это единственная реальная проверка, не означает, что вы должны ее использовать! Вы лучше придерживаетесь signed_request
основе signed_request
, так как это способ взаимодействия Facebook с вашими приложениями, пользователи не предназначены для использования signed_request и не должны ни при каких условиях быть переданы как часть строки запроса! Если пользователь имитирует это, что-то, вероятно, ошибочно, я не буду беспокоиться о том, что в этом случае будет неправильный стиль.
Сегодня утром я столкнулся с этим же вопросом – я хочу, чтобы пользователи настольных компьютеров обращались к моему приложению через facebook, но я хочу, чтобы мобильные пользователи могли получать доступ к приложению напрямую через URL. Как сказал Флойд Уилберн, доступ к различным версиям приложения с помощью разных URL-адресов является хорошим вариантом, но вместо того, чтобы иметь две копии приложения (трудно поддерживать), я использовал mod_rewrite для перезаписи каталога / facebook в корень приложения:
# rewrite both /facebook and / to same place so you # can tell if your request came from facebook or from direct URL access :) RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} /facebook* RewriteRule (.*) /index.php [L]
Обязательно установите URL-адрес вкладки страницы Facebook, чтобы приземлиться в подкаталоге / facebook. Теперь вы можете взломать браузер, чтобы узнать, являются ли они мобильным или настольным пользователем, и вы можете протестировать запрошенный URL-адрес, чтобы узнать, обращаются ли они к приложению через Facebook или напрямую 🙂
Позвольте мне добавить, что нет никакого надежного способа определить тип клиента или точку доступа – оба могут быть подделаны кем-то, кто знает, что они делают, поэтому учитывайте это при разработке механизмов безопасности и аутентификации вашего приложения.