Вопрос

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

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

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

Это было полезно?

Решение

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

  1. Проверьте shinded_request, если существует, проанализируйте его, если это так. Если это не так, установите флаг $ login на 1 в php
  2. Я проверяю сеанс / cookie пользователя, чтобы увидеть, был ли пользователь ранее аутентифицирован приложением (вернется к этому позже. Если он пуст, установите $ login на 1.
  3. Если флаг входа установлен на 1, отправьте пользователя на URL -адрес установки.
  4. Пользователь устанавливает приложение и отправляется на страницу соединителя. Эта страница служит целью получения Access_token и создания сеанса / cookie для пользователя. Это означает, что вам, скорее всего, потребуется проверить обоснованность этой доступа access_token в течение срока службы сеанса пользователя. 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, но в идеале вы хотели бы сохранить UID пользователя в Facebook вместе с токеном Access. Это, как правило, вам нужно включить UID вместе с токеном Access в ваш вызов API.

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

ПРИМЕЧАНИЕ. Если приложение не запросило разрешение OFFLINE_ACCESS, токен доступа связан с временем. Освященный временем токен доступа также становится недействительным, когда пользователь выходит из Facebook. Если приложение получило разрешение offline_access от пользователя, токен доступа не имеет истечения. Однако он недействительным, когда пользователь меняет свой пароль.

В -третьих, цель наличия Access_token и UID - выполнить вызов API, верно? Начните оттуда. Сделайте аутентификацию, если только access_token (каким -то образом) стал недействительным. Как проверить, действителен ли он или нет? Ну, вы можете использовать Curl (Ссылка) или же Прокси библиотека(Но вам может потребоваться изменить его лил, так как он первоначально был написан для 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, довольно устаревшие.

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

Введение

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

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

Что касается FB Connect, так как ваш сценарий должен убедиться, что у вас есть токен Auth или код Auth, когда вам требуется аутентификация. Если у вас этого нет, вам нужно получить это. Вы можете использовать наличие кода ouuth или токена в качестве условия, для которого можно отобразить кнопку 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 OAuth. Эта часть не задокументирована вообще, кроме как в их учебном пособии по аутентификации. http://developers.facebook.com/docs/authentication/

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

Вывод

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

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

То, как я узнал, было, написав для этого свою собственную структуру. Я предлагаю вам сделать то же самое. Вы можете продлить уроки Facebook SDK, если хотите. Это действительно ограничено, но это дает вам все, что вам нужно. Я взял свои наиболее часто используемые вызовы 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 Get -запрос и получить 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?

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top