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

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

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

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

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

Это путь, или я упускаю лучшие альтернативы?

2 ответов


  1. вам не нужно нажимать идентификатор пользователя через ajax. На стороне сервера вы должны использовать файл cookie fbsr_{app_id}, который содержит signed_request. Проанализируйте этот signed_request, используя ваш "секретный" app_secret, выданный FB, чтобы получить "user_id". Примечание: успешный анализ также показывает, что данные cookie, предоставленные FB, не подделаны.

  2. Как только вы проанализируете signed_request, вы также должны получить время "issued_at". Проверьте, что это время находится в пределах последние 10 минут. Делая это, вы знаете, что запрос на вход попал на ваш сервер, поскольку пользователь (с user_id) использовал клиентский SDK. (См.: http://developers.facebook.com/roadmap/completed-changes/)

  3. вы должны немедленно обменять этот код на access_token. Если это не удается (FB выдаст вам сообщение об ошибке типа OAuthException), это означает, что произошла неестественная задержка между входом пользователя в facebook и получением логина запрос.

с шагом #2 Вы можете сорвать попытки атаки, используя старый файл cookie fbsr_. Если у пользователя (из user_id) уже есть учетная запись с вами, вы можете остановиться здесь и войти в систему. Однако возможны ситуации, в которых ваш app_secret может быть нарушена. Чтобы позаботиться об этом случае, вы должны следовать шагу #3, как обмен кодом для access_token может произойти только один раз и в течение 10 минут после его выпуска. Если у пользователя нет учетной записи на вашем сайте, тогда вам все равно нужен Шаг #3, чтобы использовать access_token для получения других необходимых пользовательских данных, таких как имя, электронная почта и т. д. из FB.

таким образом, кто-то еще крадет cookie жертвы и пытается атаковать возможен только в пределах этого 10-минутного разрыва безопасности. Если вы недовольны этим отверстием безопасности, вы должны перейти на аутентификацию на стороне сервера. Решение зависит от чувствительности информации пользователя, которую вы храните. И вы не компрометируйте все, что перемещается на серверную аутентификацию, вы можете одновременно продолжать использовать методы на стороне клиента для других вещей.


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

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

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

вы также можете проверить этот вопрос: правильный подход к FB auth