Facebook Login: Как совместить JavaScript с PHP SDK?

Как я могу объединить примеры из обоих

https://github.com/facebook/php-sdk/blob/master/examples/example.php и https://github.com/facebook/connect-js/blob/master/examples/jquery/login.html

Конечная цель состоит в том, чтобы мы могли использовать jQuery для входа, и каким-то образом следующая строка будет работать

$user = $facebook->getUser(); 

В настоящее время я замечаю, что когда я вхожу с помощью JavaScript, он не устанавливает сеанс с PHP, следовательно, он несовместим с PHP на базе SDK (так что пользователь в этом случае все равно будет null)

Я не большой поклонник <a href="$facebook->getLoginUrl()">Login with Facebook</a> , потому что он заставляет браузер загружать другую страницу (логин facebook), а затем перенаправляет обратно веб-приложение. Это гораздо более идеально, если я могу загрузить всплывающее окно для входа в систему, а затем прозрачно перенаправлять обратно в мое веб-приложение. Поэтому любые предложения о том, как я могу продвигать этот пользовательский опыт, будут очень благодарны. Спасибо!

Solutions Collecting From Web of "Facebook Login: Как совместить JavaScript с PHP SDK?"

Я просто использую кнопку входа в систему Facebook – https://developers.facebook.com/docs/reference/plugins/login/

После того, как пользователь использовал это для входа (если они еще не были) и предоставить доступ к вашему приложению (сайту), PHP-SDK не должен иметь проблем с использованием сеанса Facebook и API.

Обновить

Я просто попробовал это с новой версией SDK версии 3.0, и он определенно не работает. Обнаружено это в блоге разработчика

Если вы используете JavaScript SDK для входа в систему вместе с PHP SDK, вам нужно будет дождаться обновления JavaScript SDK (через 4 недели). Версия 3.0.0 PHP SDK не будет сотрудничать с текущим JavaScript SDK из-за изменения формата файла cookie.

Другими словами, используйте SDK версии v2 до тех пор, пока не будет обновлен JS SDK.

Не уверен, что у вас это работает. Текущий JS API имеет конфигурацию для сохранения файла cookie, чтобы сервер мог его прочитать:

 FB.init({ appId : 'YOUR APP ID', cookie : true }); 

Теперь, в PHP, вы можете сделать следующее, чтобы использовать сеанс из JS:

 // Read the cookie created by the JS API $cookie = preg_replace("/^\"|\"$/i", "", $_COOKIE['fbs_' . FB_APP_ID]); parse_str($cookie, $data); // Startup the Facebook object $fb = new Facebook(array( 'appId' => FB_APP_ID, 'secret' => FB_APP_SECRET )); // Say we are using the token from the JS $fb->setAccessToken($data['access_token']); // It should work now var_dump($fb->getUser()); 

Надеюсь, это помогло.

это похоже на то, что facebook не исправил эту проблему в нужное время (поскольку они говорят https://developers.facebook.com/blog/post/503 ).

это новейшая информация о js sdk https://developers.facebook.com/blog/post/525/

После долгих часов поиска я обнаружил, что это устранило мою проблему, когда PHP SDK не подобрал сеанс Facebook. По-видимому, Javascript SDK не устанавливает правильный сеанс. Добавьте это в свой auth.login eventlistener:

 FB.Event.subscribe('auth.login', function(response) { FB._oauth = false; FB.Cookie.setEnabled(true); FB.Auth.setSession(response.authResponse, response.status); FB._oauth = true; window.location.reload(); }); 

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

Редактировать: Сегодня утром все работает нормально. Когда я тестировал еще немного, я обнаружил, что мне пришлось редактировать base_facebook.php, чтобы убедиться, что запросы на Facebook не будут тайм-аутами. Я предполагаю, что, поскольку я тестирую свою локальную машину, соединение будет недостаточно быстрым, чтобы сделать это вовремя. Это объясняет странное поведение, когда оно иногда бывает, а иногда и не работает.

Измените время соединения в массиве $ CURL_OPTS в строке 128:

 public static $CURL_OPTS = array( CURLOPT_CONNECTTIMEOUT => 20, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_USERAGENT => 'facebook-php-3.1', ); 

В версии 4 SDK он автоматически работает с JavaScript SDK. Вам просто нужно использовать FacebookJavaScriptLoginHelper :

 $helper = new FacebookJavaScriptLoginHelper(); // Get access token from JS SDK try { $session = $helper->getSession(); } catch(FacebookRequestException $e) { // When Facebook returns an error echo "Exception occured, code: " . $e->getCode(); echo " with message: " . $e->getMessage(); } catch(\Exception $e) { // When validation fails or other local issues echo "Exception occured, code: " . $e->getCode(); echo " with message: " . $e->getMessage(); } // If logged in if($session) { // Get user profile try { $user_profile = (new FacebookRequest( $session, 'GET', '/me' ))->execute()->getGraphObject(GraphUser::className()); print_r($user_profile); } catch(FacebookRequestException $e) { echo "Exception occured, code: " . $e->getCode(); echo " with message: " . $e->getMessage(); } } 

Не нужно возиться с куки!