Реализация аутентификации Facebook

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

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

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

Related of "Реализация аутентификации Facebook"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если вы беспокоитесь о безопасности, возможно, вы можете установить, что сеанс cookie истекает раньше, чем session_set_cookie_params () .

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

Во-вторых, из документации для Facebook

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

В-третьих, целью иметь access_token и uid является выполнение вызова API, правильно? Начните оттуда. Сделайте аутентификацию, если только access_token (каким-то образом) стал недействительным. Как проверить, действительно ли это или нет? Ну, вы можете использовать cURL ( Reference ) или прокси-библиотеку (но вам может потребоваться изменить ее lil bit, поскольку она первоначально была написана для 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')); } 

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

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

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

Введение

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

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

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

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

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

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

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

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

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

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

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

Вывод

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

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

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

Я думаю, что вам не нужно реализовывать 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, просто запустите a / me? Access_token GET-запрос так часто, как вам нужно, чтобы проверить, что пользователь все еще там.

4, Вы можете сохранить идентификатор Facebook.

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

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