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