我们有一个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();
}
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
包含重定向的所有回调函数。这些都是放在页面中的短代码,因此网址将为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'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;
}
}
}
我在SO上经历了不少问题。我注意到的是,当我第一次运行该页面时,我的会话中的FBRLH_state
就是abcdef
。但是,当我点击登录按钮后收到回复时,我的FBRLH_state
为xyz
。我不知道这是否会对结果产生影响。如果可以,我将如何使用此状态?我没有设置它,我假设FB SDK没有。
当我使用FacebookRedirectLoginHelper
时,FB PHP SDK v4没有发回任何内容。为什么会这样做,我该如何解决?
答案 0 :(得分:0)
您是否仅使用来自official GitHub的官方FacebookRedirectLoginHelper进行测试? 我已经多次使用Facebook SDK,并且从未遇到过丢失退货的问题。
答案 1 :(得分:0)
所以我在corvuszero评论的帮助下解决了我的问题。
以下是我的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's 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;
}
}