Facebook PHP SDK 5 :: API 2.4 ::跨站点请求伪造验证失败.必需的参数"状态"缺失

Éri*_*rre 12 php facebook facebook-php-sdk facebook-login facebook-access-token

我做了一个非常简单的PHP脚本,只是尝试通过Facebook登录并获得accessToken.但是,当我尝试以下代码时,我从SDK中获得了一个例外:«跨站点请求伪造验证失败.必需的参数"状态"缺失.».

这是我的代码:

require_once __DIR__ . '/facebook-sdk-v5/autoload.php';
session_start();

$fb = new Facebook\Facebook([
    'app_id' => '{my-own-app-id}',
    'app_secret' => '{my-own-app-secret}'
]);

// Check to see if we already have an accessToken ?
if (isset($_SESSION['facebook_access_token'] )) {
    $accessToken = $_SESSION['facebook_access_token'];
    echo "Horray we have our accessToken:$accessToken<br />\n";

} else {
    // We don't have the accessToken
    // But are we in the process of getting it ? 
    if (isset($_REQUEST['code'])) {
        $helper = $fb->getRedirectLoginHelper();
        try {
            $accessToken = $helper->getAccessToken();
            } catch(Facebook\Exceptions\FacebookResponseException $e) {
              // When Graph returns an error
              echo 'Graph returned an error: ' . $e->getMessage();
              exit;
        } catch(Facebook\Exceptions\FacebookSDKException $e) {
              // When validation fails or other local issues
              echo 'Facebook SDK returned an error: ' . $e->getMessage();
            exit;
        }

        if (isset($accessToken)) {
              // Logged in!
              $_SESSION['facebook_access_token'] = (string) $accessToken;

              // Now you can redirect to another page and use the
              // access token from $_SESSION['facebook_access_token']

              echo "Finally logged in! Token:$accessToken";
        }           
    } else {
        // Well looks like we are a fresh dude, login to Facebook!
        $helper = $fb->getRedirectLoginHelper();
        $permissions = ['email', 'user_likes']; // optional
        $loginUrl = $helper->getLoginUrl('http://mywebsite.com/myapp/index.php', $permissions);

        echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>';
    }

}

exit;
Run Code Online (Sandbox Code Playgroud)

小智 24

我不得不在一些服务器中添加这些行:

$helper = $fb->getRedirectLoginHelper();
if (isset($_GET['state'])) {
    $helper->getPersistentDataHandler()->set('state', $_GET['state']);
}
Run Code Online (Sandbox Code Playgroud)

我随机收到此错误,具体取决于服务器配置.

  • 不要这样做!这有效地绕过了CSRF检查. (4认同)

che*_*zeh 9

如果您使用网站的"www"版本来生成登录链接,并且您被重定向到非www版本,则会遇到会话问题.因此,请确保您访问您网站的www版本,然后将回调网址定义为相同的www版本.此外,您可以在服务器配置中定义永久重定向,以确保从非www版本访问您站点的任何人都被重定向到www版本,反之亦然.


Ruh*_*min 9

两个脚本开头的session_start().我从这里得到了解决方案:https://github.com/facebook/facebook-php-sdk-v4/issues/473


Éri*_*rre 1

这里真正的问题是我的 PHP 文件的编码。我用的是UTF8,但它应该是UTF8 w/o BOM。

错误编码的副作用是我的 SESSION 无法正常工作,然后 SDK 无法检索正常工作所需的信息。

正确配置的错误报告会直接告诉您存在问题。

我认为我们可以在“noob”类别中填补这个错误。但我仍然认为它对像我这样的其他菜鸟来说还是有用的。