Получение сеанса Facebook в Wordpress

ПРЕДПОСЫЛКИ

У нас есть сайт Wordpress, для которого требуется особый вид аутентификации Facebook. Сайт WP должен аутентифицировать пользователя с другим приложением, а затем зарегистрировать пользователя в приложении. Веб-приложение построено нами, и у него есть API, который использует сайт WP, чтобы взаимодействовать с ним. Прежде чем мы все получим rowdy, весь этот процесс аутентификации работает с обычной формой входа в систему. Используя API, мы можем легко видеть, что пользователь зарегистрирован или не зарегистрирован в приложении и отображает его на сайте WP.

ПРОБЛЕМА

Как уже говорилось, нам нужна аутентификация Facebook. Я использую Facebooks PHP SDK v4 и встроил его в пользовательский плагин, чтобы сохранить код отдельно от темы. Когда пользователь нажимает на значок FB, он показывает всплывающее окно с правильным URL-адресом переадресации. Через некоторое время это всплывающее окно закрывается, но в результате ничего нет. Несколько хорошо размещенных var_dumps показывают, что я ничего не получаю от FacebookRedirectLoginHelper. Это означает, что я не могу получить сеанс, который по очереди означает отсутствие информации о пользователе.

CODE

Как уже говорилось, я создал плагин (ns-social.php), который обрабатывает все. Вот этот файл:

/**
 * Plugin Name: NS Social Plugin
 */

require_once 'ns-social-init.php';
require_once 'ns-callback-functions.php';
require_once 'ns-facebook.php' ;

$fb = null;
add_action('plugins_loaded','load_fb');

function load_fb() {
    global $fb;
    $fb = new WP_Facebook();
}

/**
 * SOCIAL LOGIN CHECK
 */

function get_fb_url()
{
    global $fb;
    return $fb->login_url();
}

ns-social-init.php запускает сеанс, который FB может использовать:

/**
 * Any functions that are required during initialisation of Wordpress or this plugin
 */
add_action('plugins_loaded', 'start_session');

function start_session()
{
    if (!session_id()) {
        session_start();
    }
}

ns-callback-functions.php содержит все функции обратного вызова для перенаправления. Это все короткие коды, которые размещаются на страницах, поэтому url будет www.site.com/facebook-callback, и на этой странице будет [facebook-callback], в котором будет обрабатываться запрос.

add_shortcode('facebook_callback', 'facebook_callback');
function facebook_callback()
{
    global $fb;
    if (isset($_GET['error'])) {
        if ($_GET['error'] == 'access_denied') {
            echo "<script>
                if(window.opener != null) {
                    window.close();
                }
            </script>";
            exit;
        }
    }
    $session = $fb->get_session();
    $userArr = $fb->get_user();
    $user['name']     = $userArr['first_name'];
    $user['surname']  = $userArr['last_name'];
    $user['email']    = $userArr['email'];
    $user['verified'] = $userArr['verified'];
    $_SESSION['registeruser'] = $user;
    $_SESSION['registertype'] = 'Facebook';
    $action = "";
    die(var_dump($_SESSION,true));
    if (user_exists($user['email'])) {
        $action = '?login';
    }
    wp_redirect(home_url('social-register/' . $action));
}

И последнее, но не менее важное: мой ns-facebook.php файл:

use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookSession;
use Facebook\FacebookRequest;

class WP_Facebook
{
    var $helper;
    var $session;
    var $permissions;
    var $loginurl;

    public function __construct()
    {
        // Initialize the SDK
        FacebookSession::setDefaultApplication('0appId145', '00hahaitsmysecret23523');
        $this->permissions = ['public_profile', 'email'];
        $this->helper = new FacebookRedirectLoginHelper(home_url('facebook-callback'));
        $this->loginurl = $this->helper->getLoginUrl($this->permissions);
    }

    /**
     * Returns the login URL.
     *
     * @return string
     */
    public function login_url()
    {
        return $this->loginurl;
    }

    /**
     * Returns the current user info as an array.
     */
    public function get_user($session = null)
    {
        if(empty($session)) $session = $this->session;
        if($session) {
            /**
             * Retrieve User Profile Information
             */
            // Graph API to request user data
            $request = new FacebookRequest($session, 'GET', '/me');
            $response = $request->execute();

            // Get response as an array
            $user = $response->getGraphObject()->asArray();

            return $user;
        }

        return false;
    }

    public function get_session() {
        try {
            $this->session = $this->helper->getSessionFromRedirect();
        } catch(FacebookRequestException $ex) {
            // When Facebook returns an error
        } catch(\Exception $ex) {
            // When validation fails or other local issues
        }
        if ($this->session) {
            return $this->session;
        }
    }
}

ЧТО Я ИСКЛЮЧАЛ

Я рассмотрел довольно много вопросов о SO. Я заметил, что при первом запуске страницы мой FBRLH_state в моем сеансе, например, abcdef. Но когда я получаю ответ после нажатия кнопки входа, мой FBRLH_state - xyz. Я не знаю, влияет ли это на результат. Если бы это было возможно, как бы я использовал это состояние? Я не устанавливаю его, я предполагаю, что FB SDK делает.

TL; DR

FB PHP SDK v4 не отправляет ничего, когда я использую FacebookRedirectLoginHelper. Зачем это делать и как это исправить?

Ответы

Ответ 1

Итак, я исправил свою проблему с помощью corvuszero comment.

Здесь код в моем файле ns-facebook.php:

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\FacebookRedirectLoginHelper;
class WP_Facebook
{
    var $helper;
    var $session;
    var $permissions;
    var $loginurl;

    public function __construct()
    {
        // Initialize the SDK
        FacebookSession::setDefaultApplication('303664476506500', '0197b7f08cc46f051ddb92dfba077484');
        $this->permissions = ['public_profile', 'email'];
        $this->helper = new FacebookRedirectLoginHelper( home_url('facebook-callback') );

        try {
            $this->session = $this->helper->getSessionFromRedirect();
        } catch (FacebookRequestException $e) {
            // handler
        } catch (Exception $e) {
            // handler
        }

        if(isset($_SESSION['fb_token'])) {
            $this->session = new FacebookSession( $_SESSION['fb_token'] );
        }

        if($this->session) {
            $_SESSION['fb_token'] = $this->session->getToken();
        } else {
            $this->loginurl = $this->helper->getLoginUrl($this->permissions);
        }
    }

    /**
     * Returns the login URL.
     *
     * @return string
     */
    public function login_url()
    {
        return $this->loginurl;
    }

    /**
     * Returns the current user info as an array.
     */
    public function get_user()
    {
        if($this->session) {
            /**
             * Retrieve User’s Profile Information
             */
            // Graph API to request user data
            $request = new FacebookRequest($this->session, 'GET', '/me');
            $response = $request->execute();

            // Get response as an array
            $user = $response->getGraphObject()->asArray();

            return $user;
        }

        return false;
    }

    public function get_session() {
        return $this->session;
    }
}

Ответ 2

Вы сделали тест только с официального FacebookRedirectLoginHelper из официального GitHub? Я использовал SDK Facebook пару раз и никогда не испытывал проблем с отсутствием отдачи.