Вход в Facebook: Как объединить 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, следовательно, это несовместимый с SDK на основе PHP (поэтому $user в этом случае все равно будет равен нулю)
Я не большой поклонник <a href="$facebook->getLoginUrl()">Login with Facebook</a>
,
потому что это заставляет браузер загружать другую страницу (логин facebook), а затем перенаправляет обратно в веб-приложение. Гораздо лучше, если я смогу загрузить всплывающее окно для входа пользователя, а затем прозрачно перенаправить его обратно в мое веб-приложение. Поэтому любые предложения о том, как я могу реализовать этот пользовательский интерфейс, будут весьма признательны. Спасибо!
5 answers
Я просто использую кнопку входа в Facebook - https://developers.facebook.com/docs/reference/plugins/login/
После того, как пользователь использовал это для входа в систему (если он еще этого не сделал) и предоставления доступа к вашему приложению (сайту), у PHP-SDK не должно возникнуть проблем с использованием сеанса Facebook и API.
Обновление
Я только что попробовал это с новой версией 3.0 PHP SDK, и это определенно не работает. Нашел это в блоге разработчика
Если вы используете JavaScript SDK для входа в систему в сочетании с PHP SDK, вам нужно будет дождаться обновления JavaScript SDK (через 4 недели). Версия 3.0.0 PHP SDK не будет сотрудничать с текущим JavaScript SDK из-за изменения формата файлов cookie.
Другими словами, используйте PHP SDK версии 2 до тех пор, пока не будет обновлен 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. По-видимому, SDK Javascript неправильно настраивает сеанс. Добавьте это в свой список событий auth.login
:
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 не будут отправлены по тайм-ауту. Я предполагаю, что, поскольку я тестирую на своем локальном компьютере, соединение будет недостаточно быстрым, чтобы сделать это вовремя. Это объясняет странное поведение, когда иногда это срабатывало, а иногда не срабатывало.
Измените значение параметра connecttimeout в массиве $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();
}
}
Не нужно возиться с печеньем!