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

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

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

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

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

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

…而且“行之有效”。

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

auth.php

if (!session_id()) {    session_start();}$oFB = new FacebookFacebook([    '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.

auth_callback.php

if (!session_id()) {    session_start();}$oFB = new FacebookFacebook([    '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的默认会话方法将永远无法工作。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5009515.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-14
下一篇2022-11-14

发表评论

登录后才能评论

评论列表(0条)

    保存