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

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

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

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

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

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


person sbichenko    schedule 06.01.2013    source источник
comment
Почему бы вам просто не объединить javascript-sdk с php-sdk, поскольку кажется, что вы все равно используете php в качестве языка на стороне сервера   -  person TommyBs    schedule 07.01.2013


Ответы (2)


  1. Вам не нужно нажимать идентификатор пользователя через ajax. Вы должны на стороне сервера использовать файл cookie fbsr_{app_id}, который содержит подписанный_запрос. Проанализируйте этот подписанный_запрос, используя ваш «секретный» 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 вы можете предотвратить попытки атаки, используя старый fbsr_cookie. Если у пользователя (из user_id) уже есть учетная запись с вами, вы можете остановиться здесь и войти в систему. Однако могут быть сценарии, когда ваш app_secret может быть скомпрометирован. Чтобы позаботиться об этом случае, вы должны выполнить шаг № 3, так как обмен кодом для access_token может произойти только один раз и в течение 10 минут после его выпуска. Если у пользователя нет учетной записи на вашем сайте, вам в любом случае потребуется шаг № 3, чтобы использовать access_token для получения других необходимых данных пользователя, таких как имя, адрес электронной почты и т. д., из FB.

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

person Ethan    schedule 08.01.2013
comment
@exizt Я попытался прояснить некоторые моменты для вашего понимания. Если это решит ваш вопрос, вы должны принять ответ. - person Ethan; 09.01.2013
comment
Я использую java на своей стороне сервера. Какие вызовы графического API я должен сделать для первого шага? - person coding_idiot; 23.01.2014
comment
Что вы имеете в виду под анализом файла cookie? как это сделать с помощью node.js или ASP.net? - person Bishoy Hanna; 12.08.2015
comment
Для #1 можно использовать getLoginStatus для получения подписанного запроса. - person Mike Gleason jr Couturier; 31.10.2016

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

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

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

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

person Simon Boudrias    schedule 06.01.2013