Вход в 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), а затем перенаправляет обратно в веб-приложение. Гораздо лучше, если я смогу загрузить всплывающее окно для входа пользователя, а затем прозрачно перенаправить его обратно в мое веб-приложение. Поэтому любые предложения о том, как я могу реализовать этот пользовательский интерфейс, будут весьма признательны. Спасибо!

Author: Antony, 2011-05-27

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.

 12
Author: Phil, 2011-05-31 01:36:52

Не уверен, что у вас это работает. Текущий 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());

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

 15
Author: Pedro Villa Verde, 2011-07-18 02:09:22

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

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

 1
Author: thereds1106, 2011-08-08 11:52:46

После долгих часов поиска я обнаружил, что это исправило мою проблему, когда 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',
);
 1
Author: Rick Pastoor, 2011-12-15 22:17:24

В версии 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();
    }
}

Не нужно возиться с печеньем!

 0
Author: Chuck Le Butt, 2015-04-21 17:09:11