跨站点请求伪造验证失败。必需的参数"州"失踪。 YII-2

时间:2016-04-06 17:21:08

标签: php facebook facebook-graph-api yii2 facebook-php-sdk

所以我在我的控制器中登录(这里称为facebook)动作,登录回调动作和显示动作,我想使用Facebook API查看信息。我已经了解了我的问题,并且发现我的会话似乎已关闭,但我也读到,在Yii-2中,当应用初始化时,它们会自动开启。我也尝试了没有框架,它运作良好。也许有人在Yii-2中遇到过这样的问题?

登录操作

**public function actionFacebook()**
{
    $fb = new Facebook([
        'app_id' => 'my_app_id',
        'app_secret' => 'my_app_secret',
        'default_graph_version' => 'v2.5',
    ]);
    $helper = $fb->getRedirectLoginHelper();
    $permissions = ['user_friends']; // optional
    $loginUrl = $helper->getLoginUrl('http://myblog.local/site/callback', $permissions);

    return $this->render('facebook', [
       'loginUrl' => $loginUrl,
    ]);

}

回调操作

**public function actionCallback()**
{
    $fb = new Facebook([
        'app_id' => 'my_app_id',
        'app_secret' => 'my_app_secret',
        'default_graph_version' => 'v2.5',
    ]);

    $helper = $fb->getRedirectLoginHelper();
    try {
        $accessToken = $helper->getAccessToken();
    } catch(FacebookResponseException $e) {
        // When Graph returns an error
        echo 'Graph returned an error: ' . $e->getMessage();
        exit;
    } catch(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']

        return $this->redirect('/site/display',302);
    }
}

显示操作(我想使用Facebook API查看信息)

public function actionDisplay()
{
    $fb = new Facebook([
        'app_id' => '491899464333863',
        'app_secret' => 'f684b9467c548991cc3a91e028163e15',
        'default_graph_version' => 'v2.5',
    ]);

    // Sets the default fallback access token so we don't have to pass it to each request
    $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);

    try {
        $response = $fb->get('/me');
        $userNode = $response->getGraphUser();
    } catch(FacebookResponseException $e) {
        // When Graph returns an error
        echo 'Graph returned an error: ' . $e->getMessage();
        exit;
    } catch(FacebookSDKException $e) {
        // When validation fails or other local issues
        echo 'Facebook SDK returned an error: ' . $e->getMessage();
        exit;
    }

    return $this->render('display', [
        'userName' => $userNode,
    ]);
}

2 个答案:

答案 0 :(得分:1)

在Yii2中,如果您之前未使用$S_SESSION打开会话,则更改session_start()内容将无效。

  

通过会话组件访问会话数据时,会话   如果之前没有这样做,将自动打开。这个   与通过$ _SESSION访问会话数据不同   需要显式调用session_start()。

来源http://www.yiiframework.com/doc-2.0/guide-runtime-sessions-cookies.html

Yii2有一个管理会话的课程。因此,您可以在回调操作中存储 accesToken

$session = Yii::$app->session;
$session['accessToken'] =  $accessToken; 

然后,在显示操作中:

$session = Yii::$app->session;
[...]
$fb->setDefaultAccessToken($session['accessToken']);

请记住,您可以使用调试工具栏检查$_SESSION内容。

更多信息:http://www.yiiframework.com/doc-2.0/yii-web-session.html

答案 1 :(得分:0)

您应该真正设置自己的PersistentDataInterface。有关详细信息,请参阅此答案:https://stackoverflow.com/a/38116933/1062129