Медленная загрузка приложения Facebook canvas при нажатии на ссылки (если цель верхняя)

Ситуация: я занимаюсь разработкой приложения для холста на Facebook. Facebook отправляет мне запрос POST с подписанным подписью каждый раз, когда страница отображается. Внутри моего приложения у меня есть все мои ссылки с target="_top", потому что если я этого не сделаю, Facebook отправит моему серверу общий GET без подписанного запроса. Поэтому я не могу проверить информацию о пользователе.

Проблема: это слишком медленно! даже если я тестирую его локально, каждый клик, который я нажимаю, отрисовывается в течение 1 секунды, и мой холст становится полностью белым, а затем отображается информация. Это будет плохой пользовательский опыт.

Мои тесты: если я удаляю target=_top и указываю ссылку на все свои ссылки на свой сервер без app.facebook.com/, что бы то ни было, он загружается очень быстро.

Мои сомнения: есть ли проблема безопасности с этим? Если я укажу все ссылки на мой сервер (нет apps.facebook.com), я не смогу проверить подписанный запрос, я проверю его только на главной странице.

Любой совет? любой учебник? Есть ли у меня какое-то недопонимание этого? (Это мое первое приложение на Facebook)

2 ответа

Решение

Вы читали учебник по аутентификации на стороне сервера? Ты делаешь это неправильно.

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

Что ты должен делать:

Когда вы получите POST с подписанным запросом, декодируйте его и проверьте, аутентифицирован ли пользователь, сохраняет ли он данные (токен и т. Д.) Где-то (сеанс, дБ, кэш). Если он не аутентифицирован, отправьте его в диалоговое окно авторизации, как отмечено в учебнике, когда он вернется, обменяйте полученный вами код (в GET) на токен (также показанный в учебнике), а затем перенаправьте его на http(s)://apps.facebook.com/YOUR_APP, и вы получите сообщение с подписанным запросом, сохраните его и т. д.

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

Должно быть только два раза, когда Facebook отправляет вам запрос, когда POST загружается, а второй - когда пользователь возвращается из диалогового окна аутентификации, в котором вы либо получаете параметр кода, либо ошибку в случае, если пользователь отклонил аутентификация. Другие запросы должны поступать из вашего приложения (внутри iframe) на серверы приложений.

JDL,

Я полагаю, что вы запрашиваете API графа при каждом запросе (и именно поэтому вам всегда нужен подписанный запрос). Это правильно?

API графика довольно медленный (~ 1 секунда / запрос), и вы должны использовать его только при необходимости. Например, когда вы впервые получаете access_token, вы должны сохранить его в своем сеансе и запросить API графика для получения соответствующей информации о пользователе Facebook. Но тогда вы должны поместить необходимую вам информацию об этом пользователе в вашу сессию и обновлять ее (используя API-интерфейс графа), только когда токен доступа signature_request отличается от того, который вы сохранили в своей сессии.

Поведение добавления _top к цели ваших ссылок в порядке, и это хорошая практика в пределах холста facebook.

Другие вопросы по тегам