首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨站点请求伪造验证失败。必需的对位“状态”失踪。Yii-2

跨站点请求伪造验证失败。必需的对位“状态”失踪。Yii-2
EN

Stack Overflow用户
提问于 2016-04-06 17:21:07
回答 2查看 635关注 0票数 0

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

登录操作

代码语言:javascript
复制
**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,
    ]);

}

回调动作

代码语言:javascript
复制
**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查看信息)

代码语言:javascript
复制
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,
    ]);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-06 20:21:00

在Yii2中,如果在使用session_start()之前没有打开会话,则更改session_start()内容将无法工作。

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

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

Yii2有一个类来管理会话。因此,您可以将accesToken存储在回调操作中:

代码语言:javascript
复制
$session = Yii::$app->session;
$session['accessToken'] =  $accessToken; 

然后,在显示操作中:

代码语言:javascript
复制
$session = Yii::$app->session;
[...]
$fb->setDefaultAccessToken($session['accessToken']);

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-07-08 05:04:40

你真的应该建立你自己的PersistentDataInterface。有关更多信息,请参见此答案:https://stackoverflow.com/a/38116933/1062129

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36458073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档