您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Facebook SDK返回错误:跨站点请求伪造验证失败。URL和会话中的“状态”参数不匹配

Facebook SDK返回错误:跨站点请求伪造验证失败。URL和会话中的“状态”参数不匹配

我发现,只要在生成登录URL之前启用了PHP会话,并且Facebook最终重定向到脚本的顶部,它就可以在不设置cookie的情况下正常运行。这是使用SDK的5.1版本。

在这两个脚本的顶部,我添加了…

if(!session_id()) {
    session_start();
}

…而且“行之有效”。

这是一个我有用的准系统完整示例:

if (!session_id()) {
    session_start();
}

$oFB = new Facebook\Facebook([
    'app_id'     => FACEBOOK_APP_ID,
    'app_secret' => FACEBOOK_APP_SECRET
]);

$oHelper = self::$oFB->getRedirectLoginHelper();
$sURL = $oHelper->getLoginUrl(FACEBOOK_AUTH_CALLBACK, FACEBOOK_PERMISSIONS);

// Redirect or show link to user.

if (!session_id()) {
    session_start();
}

$oFB = new Facebook\Facebook([
    'app_id'     => FACEBOOK_APP_ID,
    'app_secret' => FACEBOOK_APP_SECRET
]);

$oHelper = self::$oFB->getRedirectLoginHelper();
$oAccessToken = $oHelper->getAccessToken();
if ($oAccessToken !== null) {
    $oResponse = self::$oFB->get('/me?fields=id,name,email', $oAccessToken);
    print_r($oResponse->getGraphUser());
}

另外,在回购文档中对此进行了说明。

警告:FacebookRedirectLoginHelper使用会话来存储CSRF值。在调用getLoginUrl()方法之前,需要确保已启用会话。通常,这在大多数Web框架中都是自动完成的,但是如果您不使用Web框架,则可以添加session_start();。到您的login.PHP和login- callback.PHP脚本的顶部。您可以覆盖认的会话处理-请参阅下面的扩展点。

我要添加此注释,因为如果您碰巧正在运行自己的会话管理或并行运行多个Web服务器,请牢记这一点很重要。在这种情况下,依靠PHP认会话方法将永远无法工作。

其他 2022/1/1 18:15:52 有474人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶