Получение сеанса 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 пару раз и никогда не испытывал проблем с отсутствием отдачи.