来自URL和会话的"状态"参数不匹配

Ped*_*que 16 sdk state facebook login param

在facebook documantion中

require('include/facebook/autoload.php'); //SDK directory
$fb = new Facebook\Facebook([
'app_id' => '***********',
'app_secret' => '***********************'
]);

$helper = $fb->getRedirectLoginHelper();
$permissions = ['email', 'public_profile']; // optional
$loginUrl = $helper->getLoginUrl('http://www.meusite.com.br/login-callback.php', $permissions);
Run Code Online (Sandbox Code Playgroud)

当它指向url $ loginUrl时,返回的是:Facebook SDK返回错误:跨站点请求伪造验证失败.来自URL和会话的"状态"参数不匹配

tas*_*ski 28

我有同样的错误.

出现问题的原因是我在getAccessToken()之前执行了getLoginUrl(... )

所以在重定向的URL中摆脱getLoginUrl(...)并且代码应该可行.


gau*_*mar 17

我有同样的问题,对我来说发生错误是因为我没有在调用getLoginUrl(..)之前session_start();输入我的login.php页面代码 ,也在login-callback.php页面的顶部.

只需session_start();输入您的" 登录 "页面和" 登录回调 "页面,它就可以正常工作,就像它现在为我工作一样.

  • 是的-Facebook文档从未提及您需要启用会话。 (2认同)

小智 6

这个错误可能有两个原因:

  1. 你没打电话session_start();之前getLoginUrl调用
  2. getLoginUrl再次执行login-callback.php,因此状态值重新生成并与重定向的值不匹配


Tar*_*rek 1

这个问题让我有点困惑,因为我必须在 facebook src 文件中更改一行:

src/Facebook/Helpers/FacebookRedirectLoginHelper.php
Run Code Online (Sandbox Code Playgroud)

在函数:“validateCsrf”中,如下所示:

if ($result !== 0) {
        throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
    }
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

if ($result === 0) {
        throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
    }
Run Code Online (Sandbox Code Playgroud)

我不知道这是否违反了 facebook SDK 的安全性,所以我真的愿意接受对此答案的任何解释或建议。

您还可以在 Facebook 应用程序管理器中进行以下更改:

将您的网站和回调 URL 添加到您的 Facebook 应用程序帐户中:

setting->advanced:Valid OAuth redirect URIs
Run Code Online (Sandbox Code Playgroud)

不要忘记在每个 url 末尾添加另一个带有斜杠 (/) 的 url,并选中“客户端 OAuth 设置”中的所有 4 个复选框。

  • 这并不能解决问题,但它只是“否定”了此安全功能的初衷。您应该调查问题以找到真正的原因(正如我已经评论过的,这在大多数情况下是 PHP 会话的问题。) (2认同)