Ответ 1
-
Вам не нужно вводить идентификатор пользователя через ajax. Вы должны на стороне сервера использовать файл cookie fbsr_ {app_id}, который содержит signed_request. Разберите этот signed_request, используя свой "секретный" app_secret, выпущенный FB, чтобы получить "user_id". ПРИМЕЧАНИЕ. Успешный синтаксический анализ также показывает, что данные cookie, предоставленные FB, не подделываются.
-
После того, как вы разобрали signed_request, вы также получите время "issu_at". Убедитесь, что это время находится за последние 10 минут. Делая это, вы знаете, что запрос на вход попал на ваш сервер, поскольку пользователь (с user_id) использовал клиентский SDK. (Refer: http://developers.facebook.com/roadmap/completed-changes/)
-
Вы должны немедленно обменять этот код на access_token. Если это не сработает (FB предоставит вам сообщение об ошибке типа OAuthException), это означает, что между пользователем, вступающим в систему facebook, была неестественная задержка, и вы получили запрос на вход.
С шагом 2 вы можете предотвратить попытки атаки с использованием старого fbsr_ cookie. Если у пользователя (из user_id) уже есть учетная запись с вами, вы можете остановиться здесь и войти в систему пользователя. Однако могут быть сценарии, в которых ваш app_secret может быть скомпрометирован. Чтобы позаботиться об этом случае, вы должны следовать шагу № 3, так как обмен кодом для access_token может произойти только один раз и в течение 10 минут после выпуска. Если у пользователя нет учетной записи на вашем сайте, вам все равно потребуется шаг № 3, чтобы использовать access_token для извлечения других необходимых пользовательских данных, таких как имя, адрес электронной почты и т.д. Из FB.
Следовательно, кто-то, кто украл куки файл жертвы и пытается атаковать, возможен только в течение этого промежутка времени в 10 минут. Если вы недовольны этим отверстием для безопасности, вам необходимо выполнить миграцию на серверную проверку подлинности. Решение зависит от чувствительности хранимой информации пользователя. И вы не станете компрометировать что-либо, переходящее на серверный аут, вы можете одновременно использовать методы на стороне клиента для других вещей.