因此,我在此之前发布了一个前面的问题,但因为发现我的问题而将其删除。Facebook API会话内容随机更改
基本上,我得到这个错误:
Facebook SDK returned an error: Cross-site request forgery validation failed. The "state" param from the URL and session do not match.
我能够确定,对于一些奇怪的原因,我的$_SESSION['FBRLH_state']
的变化。这里是生成的登录网址为用户login.php
:
session_start();
}
require_once $_SERVER['DOCUMENT_ROOT'] . '/src/Facebook/autoload.php';
$fb = new Facebook\Facebook ([
'app_id' => '??????',
'app_secret' => '????',
'default_graph_version' => 'v2.4'
]);
$helper = $fb->getRedirectLoginHelper();
$loginUrl = $helper->getLoginUrl('http://example.ca/login-callback.php');
echo '<a href="' . $loginUrl . '">Login</a>';
print_r($_SESSION);
当我做了print_r($_SESSION);
,我得到这个:
Array ([FBRLH_state] => d116b427b433a0b3dc41a858782cd690)
然而(准备好魔法),在重定向到login-callback.php
文件,的$_SESSION
阵列神秘地改变为这样:
Array ([FBRLH_state] => e99c4ece0f8e48ab53dea6a4826c5593)
这里是login-callback.php
<?php
header("Content-type: text/html;charset=utf-8");
session_start();
print_r($_SESSION);
require_once $_SERVER['DOCUMENT_ROOT'] . '/src/Facebook/autoload.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/Database.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/User.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/vars/constants.php';
//Create the Facebook service
$fb = new Facebook\Facebook ([
'app_id' => '????',
'app_secret' => '????',
'default_graph_version' => 'v2.4'
]);
$helper = $fb->getRedirectLoginHelper();
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
if (isset($accessToken)) {
$mysqli = Database::connection();
// Logged in!
$_SESSION['facebook_access_token'] = (string) $accessToken;
代码当我打印$_SESSION
(我的headers
之后做的第一件事),我从login.php
一个完全不同的价值。这是没有意义的,因为他们都在同一个域(非www),它们具有相同的document.cookie
PHPSESSID
但,有一个问题。如果我按回login-callback.php
(因为login.php
重定向到它,然后由于这个奇怪的会话魔术登录失败),$_SESSION
值神秘地匹配。这不工作,如果我刷新,只有当我按回。我认为这是关于发生了什么的一些重要线索,但我不知道。
有人可以帮助我在这个非常令人沮丧的问题?任何人都知道可能会发生什么?
编辑:另外,我创建了一个空白的文件,只是
session_start();
print_r($_SESSION);
,值我得到总是比赛login-callback.php
这意味着login.php
必须改变一些会话值(但....我可以“T弄清楚如何,因为当我print_r($_SESSION);
在文件的底部,我仍然得到同样的怪异值)
这听起来不像是一个真正的“解决方案”,而是对代码的另一个问题的隐式修复。 – CBroe