Реализация аутентификации Facebook - PullRequest
6 голосов
/ 25 июля 2011

Я работаю над проектом, который будет полностью использовать аутентификацию facebook (никакой пользовательской реализации аутентификации не существует).Проект использует PHP для сценариев на стороне сервера.Я искал для реализации быстрого и безопасного механизма аутентификации, но я не могу найти подробное описание по этому вопросу.Документы Facebook являются слабыми и предоставляют только основную информацию.

Какой метод аутентификации будет уместным?Есть Javascript SDK и PHP SDK.Как я понимаю, я должен использовать Javascript SDK для входа в систему, а затем с помощью PHP SDK я проверю свою базу данных на предмет проверки учетных данных.Но использовать Graph API с PHP SDK медленно.Есть ли лучший способ проверить сессию?

Нужно ли проверять сессию на стороне сервера (PHP-SDK) при каждом запросе?

Ответы [ 7 ]

9 голосов
/ 25 августа 2011

То, что я в итоге делаю для своих приложений, довольно простое и относительно быстрое по сравнению с любым другим методом, который я видел.

  1. Проверьте sign_request, если существует, проанализируйте его, если он есть.Если этого не произойдет, установите флаг $ login в 1 в PHP
  2. . Я проверяю сеанс / cookie пользователя, чтобы узнать, был ли пользователь ранее аутентифицирован приложением (вернусь к этому позже. Если это такпусто, установите $ login равным 1.
  3. Если флаг входа установлен в 1, отправьте пользователя по URL-адресу установки.
  4. Пользователь устанавливает приложение и отправляется на страницу соединителя.Эта страница предназначена для получения access_token и создания сеанса / cookie-файла для пользователя. Это означает, что вам, скорее всего, не нужно проверять действительность этого access_token на протяжении всего сеанса пользователя. Offline_access также создает новые возможности. Вы можете сохранитьaccess_token также в вашей базе данных.
  5. Всякий раз, когда у вас есть вызов, который выходит на Facebook, проверьте исключения, если вы столкнулись с исключением аутентификации, очистите сеанс пользователя и cookie. В следующий раз он заставит их обновитьих access_token, даже если этот процесс невидим для пользователя.

Я сделал это в своих приложениях, в мВ большинстве случаев мне не нужно делать запросы в FB, чтобы увидеть действительность access_token, и при этом я не должен постоянно получать его при каждом просмотре страницы.Наша цель состояла в том, чтобы уменьшить задержки в наших приложениях, но Facebook был самым большим источником задержек, поскольку это значительно сократило время.

1 голос
/ 26 августа 2011

Документация Facebook Connect довольно ограничена.На самом деле это не говорит вам, что он делает, только как это сделать.Я лично не использую ни SDK.Я построил свой собственный фреймворк для своих проектов разработки.

И SDK, и JavaScript в учебнике, IMO, довольно устарели.

Если вы хотите придерживаться одного из FBSDKs вот мое предложение.Используйте JS SDK только в том случае, если ваши запросы API Graph и т. П. Отправляются в бэкэнд PHP через Ajax.В противном случае используйте PHP SDK.

Введение

Facebook использует oAuth v2.Они описывают два разных метода потока ... на стороне сервера и на стороне клиента.Это будет реализовано так же, как и любое другое приложение, аутентифицирующееся с помощью службы oAuth v2.Они оба делают одно и то же.Единственная разница может заключаться в том, что вы можете использовать 'code' в качестве request_type для получения кода авторизации для получения токена в будущем.

Аутентификация

Насколько FBConnect обеспокоен тем, что ваш скрипт должен убедиться, что у вас есть токен авторизации или код авторизации, когда вам требуется аутентификация.Если у вас этого нет, вам нужно это получить.Вы можете использовать наличие кода авторизации или токена в качестве условия, для которого отображается кнопка FB (вход или выход из системы).

Перенаправить пользователя на oAuth для аутентификации.У Facebook их реализация oAuth связана с их диалоговым API.Более подробная информация о диалоге oAuth здесь: http://developers.facebook.com/docs/reference/dialogs/oauth/

Вы можете использовать необязательный параметр состояния для чего-то вроде защиты от CSRF.Он сохраняет свое значение после процесса и отправляется с обратным вызовом в качестве параметра GET.

Взаимодействие с приложением

В основном вы будете писать свое приложение таким же образомкак обычноРазличия будут следующие:

  1. Ваша база данных пользователей больше не хранит пароль, только UB FID.Кроме того, согласно FB Dev ToS, вы действительно не можете хранить какую-либо пользовательскую информацию.Если вы хотите хранить информацию о пользователе, вам нужно получить ее от пользователя.Вы можете заполнить эту информацию для них информацией FB, вам просто нужно, чтобы они отправили ее.
  2. Ваш метод регистрации больше не будет отправлять форму внешнего интерфейса.Он будет вызываться, когда аутентифицированный пользователь не имеет записи в БД.

Взаимодействие API

Если вы использовали код вместо токена, вам нужнозапросить токен, отправив код.Это делается с помощью Graph API oauth.Эта часть не задокументирована, кроме как в учебнике по аутентификации.http://developers.facebook.com/docs/authentication/

С вашим токеном доступа, какой бы метод вы ни использовали для его получения.Теперь вы можете запросить Graph API, как пожелаете.Это вернет объект в кодировке JSON.

Заключение

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

Лучше всего копаться в этих библиотеках и выяснять, как это работает для вас.Сделайте несколько проб и ошибок, поэкспериментируйте.

Способ, которым я научился, заключался в написании собственного фреймворка для него.Я предлагаю вам сделать то же самое.Вы можете расширить классы Facebook SDK, если хотите.Это действительно ограничено, но дает вам все, что вам нужно.Я взял свои наиболее часто используемые вызовы API и также разместил их.Теперь у меня есть очень быстрый и простой конечный результат, полученный из моей библиотеки.

1 голос
/ 25 августа 2011

Во-первых, просто напомните, что вам нужно сохранить не только access_token, но в идеале вы хотели бы сохранить пользовательский uid facebook вместе с токеном доступа.Это связано с тем, что обычно вам необходимо включить uid вместе с токеном доступа в вызов API.

Second, из Документация Facebook

Примечание. Еслиприложение не запрашивало разрешение offline_access, токен доступа ограничен по времени.Токен ограниченного по времени доступа также становится недействительным, когда пользователь выходит из Facebook.Если приложение получило от пользователя разрешение offline_access, у маркера доступа нет срока действия.Однако он становится недействительным всякий раз, когда пользователь меняет свой пароль.

В-третьих, цель получения access_token и uid - это выполнить вызов API, верно?Начните оттуда. Аутентификация, если только access_token (каким-то образом) становится (недействительным) недействительной. Как проверить, является ли она действительной или нет?Что ж, вы можете использовать cURL ( Reference ) или Proxy Library (но вам может понадобиться изменить его, если он изначально был написан для CI), чтобы сделать вызов API какпроцесс проверки.Пример (* вздох, используя мою прокси-библиотеку) ...

// Suppose we are try to publish a status from our fb app
// $access_token hold the user access_token, which you saved into your database
// $uid hold the user facebook uid, which you saved into your database
$proxy = new Proxy;
// This is equal with perform regular HTTP POST request with cURL
$api_call = $proxy->http('post','https://graph.facebook.com/'.$uid.'/feed', array('access_token' => $access_token,'message' => 'foo'));

// Now we can validate...
// If the API success, it will be returned a post id, with json format
// if not, it will be outputing json like...
// "{"error":{"type":"OAuthException","message":"Invalid OAuth access token."}}"
// so...
$result = (array) json_decode($api_call);
if(array_key_exists('error', $result))
{
    // Here you can perform an oAuth authentification, to get fresh access_token and update your database
    // ...
    // After it done, process the previous api call with valid access_token
    $proxy->http('post','https://graph.facebook.com/'.$uid.'/feed', array('access_token' => $access_token,'message' => 'foo'));
}
1 голос
/ 25 августа 2011

Я думаю, вам не нужно внедрять SDK.

1, Вам необходимо получить разрешение от пользователя, чтобы получить доступ к его / ее данным.Поэтому вам нужно перенаправить их на Facebook.Это несколько (3-5) строк кода в php.

https://graph.facebook.com/oauth/authorize?
client_id=YOUR_APP_ID&scope=email&redirect_uri=APP_URL 

2, Когда пользователь возвращается на ваш сайт, приходит с $ _GET ['code']

http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER

3, Вы должны декодировать этот код через Facebook получить запроси получите access_token.

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

3, После того, как у вас access_token, просто запустите GET-запрос / me? access_token так часто, как вам нужно, чтобы убедиться, что пользователь все еще там.4, Вы можете сохранить идентификатор Facebook.

Я думаю, что это самый быстрый способ.Насколько я знаю, javascript sdk использует всплывающее окно, что блокируется в большинстве браузеров.

Этот поток достаточно подробно здесь: http://developers.facebook.com/docs/authentication/

1 голос
/ 25 августа 2011

Начиная с последних версий, PHP и JS SDK теперь могут получать доступ к одному и тому же сеансу пользователя (войдите с помощью JS или PHP [вместо того, чтобы выполнять оба действия)).Прочтите эту запись в блоге для более подробного объяснения и примера.

Если вы беспокоитесь о безопасности, возможно, вы могли бы установить истечение срока действия cookie сессии с помощью session_set_cookie_params () .

1 голос
/ 25 августа 2011

Вы можете использовать один или другой или оба.

Вы можете использовать PHP SDK для генерации соответствующих URL-адресов для отправки людям. И просто нажмите на ссылку. Или вы можете использовать Javascript, чтобы сделать кнопку входа в Facebook по умолчанию.

После этого вы можете использовать один или другой для ведения и проверки сеанса.

Обычно я использую PHP, чтобы выполнять работу с клавишами oAuth, и использую JavaScript SDK, чтобы создавать приятные кнопки Facebook и некоторые менее важные графические вызовы для мониторинга сеансов.

Все, что связано с любыми тяжелыми или множественными графическими вызовами, которые я нажимаю на PHP

Но есть гибкость, чтобы делать то, что вы хотите. Вам не нужно использовать JavaScript SDK для входа в систему.

Вам решать, хотите ли вы проверять загрузку каждой страницы или нет.

Я склонен использовать Javascript SDK, чтобы справиться с этим, и, как и Берк, если сеанс мертв. Вызовите страницу перенаправления на сценарий выхода.

1 голос
/ 23 августа 2011

Отвечая на мой вопрос:

Я использовал Javascript SDK для проверки доступности аутентификации Facebook.

  • Если fb-аутентификация в порядке и мое приложение не аутентифицировано, я предоставляю пользователю предварительно заполненную регистрационную форму facebook.
  • Если аутентификация fb не в порядке, я представляю кнопку входа на Facebook.

Плагин регистрации авторизует мое приложение, и я вызываю свой fblogin.php, чтобы проверить эту информацию с помощью PHP SDK. Когда PHP SDK проверяет авторизацию, он сохраняет эту информацию в переменной сеанса. Поэтому нет необходимости проверять аутентификацию fb при каждом запросе.

Кнопка входа в систему аналогична плагину регистрации. Эти методы используют одну и ту же функциональность на стороне сервера, но их представление отличается.

Чтобы узнать статус выхода из Facebook, я использовал Javascript SDK для проверки подлинности Facebook при каждом запросе. Если пользователь вышел из системы, мой js-код вызывает fblogout.php и текущий сеанс уничтожается. У этого метода есть недостаток. Если пользователь явно не выходит из моего сайта, злоумышленник может сделать что-либо от имени пользователя, отключив только js на том же компьютере.

Я не могу найти лучшего решения с быстрым временем отклика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...