Xety CookieAuth和“缺少CSRF令牌cookie”

时间:2016-01-31 18:14:39

标签: cookies csrf remember-me cakephp-3.x

我终于将我的应用程序升级到cakephp 3.2,因为我已经用3.1 +解决了another problem

长话短说,我正在使用Xety CookieAuth让我的用户在他们回到我的网站时自动登录,而且一切都与Cake 3.0完美配合。

使用3.2,我遇到了“找不到页面”错误,我可以在我的日志文件中看到这一点:

2016-01-31 12:49:42 Error: [Cake\Network\Exception\InvalidCsrfTokenException] Missing CSRF token cookie

我做错了什么?我试着看看是否需要升级其他东西,检查文档,但一切似乎都正确......

编辑:我注意到如果我从AppController中删除它,一切似乎都有效。但后来我失去了自动登录功能......

if (!$this->Auth->user() && $this->Cookie->read('CookieAuth')) {
    $this->request->data = $this->Cookie->read('CookieAuth');
    $user = $this->Auth->identify();
    $this->loadModel('Users');

    if ($user) {
        $this->Auth->setUser($user);

        /* Check which browser version is in use */
        $userData = $this->Users->find('all')->where(['id' => $user['id']])->first();
        $userData->browser = $this->Browser->getData();
        $this->Users->save($userData);

        /* Check if the user has the contract_accepted flag set to true */
        if ($userData->contract_accepted != true) {
            $this->request->session()->write("checkContract", true);
        }

    } else {
        $this->Cookie->delete('CookieAuth');
    }
}

修改

经过几次尝试并感谢ndm指向正确的方向,我发现我原来的问题(我通过一个丑陋的黑客修复)是CookieAuth没有正确应用来自我的cookie的数据。我在CookieAuthenticate.php中添加了几个调试,这就是我发现的:

debug($this->_config['fields']);

/vendor/xety/cake3-cookieauth/src/Auth/CookieAuthenticate.php (line 46)
[
    'username' => 'username',
    'password' => 'password'
]

debug($cookies);

/vendor/xety/cake3-cookieauth/src/Auth/CookieAuthenticate.php (line 47)
[
    'email' => 'info@mydomain.com',
    'password' => 'mypassword'
]

那么,我如何告诉插件我没有使用用户名,而是发送电子邮件呢?

$this->loadComponent('Auth', [
    'authenticate' => [
        'Form' => [
            'fields' => ['username' => 'email']
        ],
        'Xety/Cake3CookieAuth.Cookie'
    ],
    'loginRedirect' => '/',
    'logoutRedirect' => '/',
]);

2 个答案:

答案 0 :(得分:1)

我发现了问题所在。加载Cake3CookieAuth组件时,您需要告诉它应该使用哪些字段进行身份验证。所以这是错误的,并产生错误:

$this->loadComponent('Auth', [
    'authenticate' => [
        'Form' => [
            'fields' => ['username' => 'email']
        ],
        'Xety/Cake3CookieAuth.Cookie'
    ],
    ...
]);

这是更正后的代码:

$this->loadComponent('Auth', [
    'authenticate' => [
        'Form' => [
            'fields' => ['username' => 'email']
        ],
        'Xety/Cake3CookieAuth.Cookie' => [
            'fields' => ['username' => 'email']
        ]
    ],
    ...
]);

答案 1 :(得分:0)

您没有使用插件文档中建议的代码,您不应该读取cookie并将其写入请求数据,这将使cookie身份验证器无用,因为它将不再被触发表单身份验证器将查找请求数据并将其用于身份验证。

由于此更改,现在发生错误:

<强> https://github.com/cakephp/cakephp/pull/7938

它不仅在请求为POSTPUTPATCHDELETE时才会应用CSRF验证,但只要有可用的请求数据(无论何处)它来自)。