Подтвердить что ты не робот

Как безопасно авторизировать пользователя через Facebook Javascript SDK

Я хочу, чтобы пользователи регистрировались на моем сайте, используя свой идентификатор Facebook, без перезагрузки страницы. Вот почему я использую Facebook Javascript SDK. Эта схема описывает поток авторизации с этим SDK: enter image description here

В конце процесса я знаю, что пользователь вошел в систему, и я знаю их идентификатор Facebook. Затем я могу зарегистрировать их в своей базе данных с помощью этого идентификатора и позволить им использовать его для входа в систему после этого.

Однако это кажется ужасно неуверенным.. Чтобы мой серверный script знал идентификатор пользователя, я должен отправить его через AJAX. Тем не менее, у меня нет возможности узнать, является ли это владельцем идентификатора, который пытается войти. Любой может отправить запрос POST с идентификатором (особенно один получает другой идентификатор пользователя).

Моя нынешняя идея - позволить пользователю войти в систему через JS SDK, как обычно, отправить идентификатор и токен доступа через AJAX на сервер, а затем использовать cURL в PHP script, чтобы убедиться, что пользователь действительно зарегистрировался.

Это путь, или я не вижу лучших альтернатив?

4b9b3361

Ответ 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 минут. Если вы недовольны этим отверстием для безопасности, вам необходимо выполнить миграцию на серверную проверку подлинности. Решение зависит от чувствительности хранимой информации пользователя. И вы не станете компрометировать что-либо, переходящее на серверный аут, вы можете одновременно использовать методы на стороне клиента для других вещей.

Ответ 2

Как только вы вошли в систему с помощью JS SDK, будет настроен специальный файл cookie, содержащий учетную информацию (закодированную с помощью секретного ключа, если я прав). Затем эту информацию можно использовать с помощью метода PHP SDK getUser().

Пока ваш API (конечная точка ajax) находится в том же домене, что и ваше приложение, вы должны получать этот файл cookie всякий раз, когда пользователь запрашивает ваш сервер.

Конечно, вам нужно убедиться, что Javascript SDK настроен правильно и что вы использовали параметр cookie: true, и что вы даете действительный channel файл. Если эти требования не выполняются, у вас могут возникнуть проблемы с междоменной связью и сторонними файлами cookie в IE и Safari.

Вы также можете проверить этот связанный вопрос: Правильный подход к авторизации FB