繁体   English   中英

Facebook PHP SDK登录状态参数错误

[英]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$_SESSIONgetLoginURL()值,因此它们是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM