[英]Facebook PHP SDK Login state parameter error
我创建了一个要在网页中使用的Facebook应用。 因此,我显然遵循了PHP SDK的Facebook文档,因此我阅读了登录流程,然后出现了问题。
我只是想PHP与Facebook登录连接到Facebook,如在Facebook的文档 。
因此,我将我的Facebook对象放入了一个类,这是代码:
class.socialmanager.php
function __construct($_appID,$_appSecret,$_appCallback){
$this->_fbAppCallback=$_appCallback;
$this->_fbConnection=new Facebook\Facebook([
'app_id' => $_appID,
'app_secret' => $_appSecret,
'default_graph_version' => 'v2.2',
]);
$this->_fbApp=new Facebook\FacebookApp($_appID,$_appSecret);
}
function getFBLogin(){
$_fbLogin=$this->_fbConnection->getRedirectLoginHelper();
$this->_fbPermissions=['public_profile','email','publish_actions'];
return $_fbLogin->getLoginUrl($this->_fbAppCallback, $this->_fbPermissions);
}
这是login.php :
$_socialManager=new SocialManager(FB_APP_ID,FB_APP_SECRET,FB_APP_CALLBACK);
$_fbLoginURL=htmlspecialchars($_socialManager->getFBLogin());
<a href="<?php echo $_fbLoginURL; ?>">Register with Facebook</a>
<a href="<?php echo $_fbLoginURL; ?>">Login with Facebook</a>
最后这是callback.php :
require_once('config.php');
global $_socialManager;
$_fbLogin = $_socialManager->getFbObject()->getRedirectLoginHelper();
try {
$_fbAccessToken = $_fbLogin->getAccessToken();
} catch(Exception $e) {
echo $e->getMessage();
exit;
}
if(!isset($_fbAccessToken)){
/*
if(isset($_SESSION['_driver']['_id'])) { header("Location:".SITE_URL.'modifica/nfb'); }
else { header("Location:".SITE_URL.'login/nfb'); }
*/
} else {
$oAuth2Client = $_socialManager->getFbObject()->getOAuth2Client();
if (!$_fbAccessToken->isLongLived()) {
try {
$_fbAccessToken = $oAuth2Client->getLongLivedAccessToken($_fbAccessToken);
} catch (Facebook\Exceptions\FacebookSDKException $e) {
echo "<p>Error getting long-lived access token: " . $_fbLogin->getMessage() . "</p>\n\n";
exit;
}
}
$_SESSION['_driver']['_fbAccessToken'] = (string)$_fbAccessToken;
if(isset($_SESSION['_driver']['_id'])) {
global $_dbManager;
if($_dbManager->connectWithFacebook()){ header("Location:".SITE_URL.'modifica/fb'); }
else { header("Location:".SITE_URL.'modifica/nfb'); }
}
else { header("Location:".SITE_URL.'registrazionefb'); }
}
每当我遇到相同的错误: Cross-site request forgery validation failed. The "state" param from the URL and session do not match.
Cross-site request forgery validation failed. The "state" param from the URL and session do not match.
我整天都在Google搜索,我已经尝试过类似Cookie解决方案和其他众多解决方案的方法,但到目前为止,没有人帮助过我。
使用之前链接的cookie解决方案,我已经打印了$_COOKIE
, $_SESSION
和getLoginURL()
值,因此它们是:
COOKIE: [FBRLH_state]=> ea243c89dd105a17f1e716f840a9c8d7
SESSION: [FBRLH_state]=> ea243c89dd105a17f1e716f840a9c8d7
URL: https://www.facebook.com/v2.2/dialog/oauth?client_id=820771421369364&state=ea243c89dd105a17f1e716f840a9c8d7&response_type=...
如您所见,都是一样的。 但是什么都没有。
旁注:这不是我在Facebook上的第一个应用程序,昨天我刚刚完成了另一个应用程序的开发,但是该应用程序给我带来了问题,这是使我发疯的奇怪事情。 有趣的是,我已经复制/粘贴了我一直使用的相同功能。
我想我找到了一些东西。
如果我在页面加载时立即按了Facebook登录按钮,它会起作用,几秒钟后它不会
PS所有回调,应用程序ID和应用程序机密均正确无误,已被检查了无数次。
我尝试使用Javascript SDK的PPS可以正常工作(显然,我猜是)。 不知道此信息是否可以帮助某人
在$ helper = $ fb-> getRedirectLoginHelper()之后插入此代码;
$_SESSION['FBRLH_state']=$_GET['state'];
它会工作,或更详细的信息,请访问facebook登录应用程序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.