在Wordpress上获得Facebook会话

Alb*_*ert 14 php wordpress session facebook facebook-graph-api

背景

我们有一个Wordpress网站,需要一种特殊的Facebook身份验证.WP站点需要使用不同的应用程序对用户进行身份验证,然后将用户登录到应用程序.Web应用程序由我们构建,它具有WP站点用于与其交互的API.在我们都得到吵闹之前,整个身份验证过程使用正常的登录表单.使用API​​,我们可以很容易地看到用户是否登录到应用程序,并在WP站点上显示该用户.

问题

如上所述,我们需要Facebook身份验证.我正在使用Facebook的PHP SDK v4并将其内置到自定义插件中,以便将代码与主题分开.当用户单击FB图标时,它会显示带有正确重定向URL的弹出窗口.过了一会儿,这个弹出窗口关闭,但结果中没有任何内容.一些好位置var_dumps显示我没有得到任何回报FacebookRedirectLoginHelper.这意味着我无法获得会话,而这意味着没有用户信息.

如上所述,我创建了一个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();
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的是,我的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's info as an array.
     */
    public function get_user($session = null)
    {
        if(empty($session)) $session = $this->session;
        if($session) {
            /**
             * Retrieve User's 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我做了什么

关于SO,我经历了不少问题.我注意到的是,当我第一次运行页面时,我FBRLH_state的会话就是abcdef.但是当我点击登录按钮后得到回复时,我FBRLH_state就是xyz.我不知道这是否会对结果产生影响.如果可以,我将如何使用此状态?我没有设置它,我假设FB SDK没有.

TL; DR

我使用时,FB PHP SDK v4没有发回任何内容FacebookRedirectLoginHelper.为什么要这样做,我该如何解决?

Alb*_*ert 0

所以我在 corvuszero 评论的帮助下解决了我的问题。

\n\n

这是我的文件中的代码ns-facebook.php

\n\n
use Facebook\\FacebookSession;\nuse Facebook\\FacebookRequest;\nuse Facebook\\FacebookRedirectLoginHelper;\nclass WP_Facebook\n{\n    var $helper;\n    var $session;\n    var $permissions;\n    var $loginurl;\n\n    public function __construct()\n    {\n        // Initialize the SDK\n        FacebookSession::setDefaultApplication('303664476506500', '0197b7f08cc46f051ddb92dfba077484');\n        $this->permissions = ['public_profile', 'email'];\n        $this->helper = new FacebookRedirectLoginHelper( home_url('facebook-callback') );\n\n        try {\n            $this->session = $this->helper->getSessionFromRedirect();\n        } catch (FacebookRequestException $e) {\n            // handler\n        } catch (Exception $e) {\n            // handler\n        }\n\n        if(isset($_SESSION['fb_token'])) {\n            $this->session = new FacebookSession( $_SESSION['fb_token'] );\n        }\n\n        if($this->session) {\n            $_SESSION['fb_token'] = $this->session->getToken();\n        } else {\n            $this->loginurl = $this->helper->getLoginUrl($this->permissions);\n        }\n    }\n\n    /**\n     * Returns the login URL.\n     *\n     * @return string\n     */\n    public function login_url()\n    {\n        return $this->loginurl;\n    }\n\n    /**\n     * Returns the current user's info as an array.\n     */\n    public function get_user()\n    {\n        if($this->session) {\n            /**\n             * Retrieve User\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Profile Information\n             */\n            // Graph API to request user data\n            $request = new FacebookRequest($this->session, 'GET', '/me');\n            $response = $request->execute();\n\n            // Get response as an array\n            $user = $response->getGraphObject()->asArray();\n\n            return $user;\n        }\n\n        return false;\n    }\n\n    public function get_session() {\n        return $this->session;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n