Подтвердить что ты не робот

Получение сеанса facebook на стороне сервера при входе в систему с помощью JS SDK

Друзья,

Я установил логин facebook для своего сайта, используя JS SDK.

  • Если использование зарегистрировано через JS SDK, мы должны перекрестно проверить, действительно ли сеанс действителен на стороне сервера, так как клиентская сторона может быть легко скомпонована.

  • Поскольку я использую JS SDK, сервер не будет иметь доступа к сеансу facebook. Если мне нужно проверить сеанс на конце сервера, могу ли я использовать php-sdk adn extern сеанс, как это указано в https://developers.facebook.com/docs/reference/php/? В этом случае мне нужно включить расширение CURL PHP, чтобы он работал, и беспокоился, если производительность будет снижаться при использовании php sdk.

Не могли бы вы помочь мне найти ответы на вышеуказанные вопросы?

4b9b3361

Ответ 1

php sdk и javascript полностью противоположны тому, что сказал Джулиан Х. Лам, на самом деле они были созданы для совместного использования.

В php sdk documentation вы можете найти это:

Интеграция с SDK для JavaScript для JavaScript

Используется совместно с SDK для JavaScript, PHP SDK может беспрепятственно делиться пользовательскими сеансами между клиентом и сервером. Если пользователь вошел в систему с Facebook и разрешил ваше приложение, JavaScript SDK может подобрать сеанс пользователя, который сохраняется в файле cookie которые PHP SDK читает без какого-либо вмешательства на разработчик.

Чтобы включить эту функциональность, убедитесь, что при встраивании и инициализировать JS SDK, вы устанавливаете как статус, так и файл cookie параметры объекта, переданные FB.init() в true.

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

Итак, мой совет для вас - использовать Javascript SDK для обработки пользовательских событий, таких как те, которые я упоминал ранее, и обрабатывать ответы от действий пользователей, например, когда пользователь делает подобное, или разделяет сообщение, используя диалог подачи и т.д. С помощью php SDK вы просто проверяете, есть ли у вас действительный пользователь, поскольку вы используете один и тот же файл cookie для клиентской стороны и для серверной части после того, как вы обрабатываете процесс входа в систему с помощью javascript SDK, если вы сделаете это $fb_id = $facebook->getUser() ( после инициализации PHP SDK, конечно), вы получите идентификатор пользователя facebook, теперь, когда вы знаете, что у вас есть действительный пользователь, вы можете использовать PHP SDK для запроса информации о пользователе, сообщения от имени пользователя и т.д.

Вот пример правильной загрузки javascript SDK с поддержкой файлов cookie:

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    // init the FB JS SDK
    FB.init({
      appId      : 'YOUR_APP_ID',                        // App ID from the app dashboard
      channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel file for x-domain comms
      status     : true,                                 // Check Facebook Login status
      xfbml      : true,                                  // Look for social plugins on the page
      cookie     : true
    });

    // Additional initialization code such as adding Event Listeners goes here
  };

  // Load the SDK asynchronously
  (function(d, s, id){
     var js, fjs = d.getElementsByTagName(s)[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement(s); js.id = id;
     js.src = "//connect.facebook.net/en_US/all.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>

И это простой код на стороне сервера, чтобы просветить вас:

require_once("facebook.php");

$config = array();
$config[‘appId’] = 'YOUR_APP_ID';
$config[‘secret’] = 'YOUR_APP_SECRET';
$config[‘fileUpload’] = false; // optional

$facebook = new Facebook($config);
try {
    $user_profile = $facebook->api('/me','GET');
    $user_name = $user_profile['name'];
    $user_email = $user_profile['email'];

} catch(FacebookApiException $e) {
    // If the user is logged out, you can have a 
    // user ID even though the access token is invalid.
    // In this case, we'll get an exception, so we'll
    // just ask the user to login again here.
}

PS: этот код на стороне сервера работает только в том случае, если пользователь уже предоставил разрешения с областью электронной почты

Ответ 2

В этот вопрос входят две части: во-первых, есть разница в потоке пользовательского интерфейса. См.: https://developers.facebook.com/docs/concepts/login/login-architecture/

1) Сторона браузера с JS SDK. Вы начинаете с диалога oauth 2.0, получаете токен доступа, а затем используете это для доступа к API Facebook.

2) На стороне сервера используется signed_request, отправленный на сервер. С помощью этого вы можете извлечь user_id. Смотрите: https://developers.facebook.com/docs/howtos/login/signed-request/ -

Шаг 1 - описать signed_request, как вы можете получить его из PHP или JS SDK
Шаг 2 - как проверить, что signed_request не сфабрикован.

Значок Oauth от других поставщиков может быть интегрирован с FB. См. Мой пример Dropbox: apps.facebook.com/fileglu/- около сентября 2011 года, также ознакомьтесь с техническим разделом для деталей реализации, включая CSRF, CORS и избегайте криптографии javascript.

Ответ 3

Библиотека javascript Facebook и php SDK могут по существу считаться двумя объектами, которые не разговаривают друг с другом, так как один клиентский, а другой - серверный.

php SDK дает вам более мелкий контроль над сеансом входа в систему, в то время как javascript-библиотеку легче начать.

Как правило, пользователь, зарегистрированный через библиотеку javascript, автоматически не регистрируется на стороне сервера, хотя в некоторых случаях может быть возможно отправить токен доступа с сервера на сервер. Однако не рекомендуется, поскольку эти данные могут быть перехвачены.

Этот связанный вопрос рассказывает о посылке маркера доступа (как извлеченного из библиотеки JS) на сервер.

По существу:

FB.login(function(response) {
    var access_token = response.authResponse.accessToken;

    // Make an ajax call here to your server-side, and send access_token in.
});