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

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 (так что пользователь в этом случае все равно будет равен нулю)

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

4b9b3361

Ответ 1

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

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

Update

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

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

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

Ответ 2

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

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

Ответ 4

После долгих часов поиска я обнаружил, что эта проблема исправлена, когда 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. После исправления этих элементов он наконец-то сработал.

Edit: Сегодня утром все было хорошо. Когда я тестировал еще немного, я обнаружил, что мне пришлось редактировать 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',
);

Ответ 5

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

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