【问题标题】:Xety CookieAuth and "Missing CSRF token cookie"Xety CookieAuth 和“缺少 CSRF 令牌 cookie”
【发布时间】:2016-01-31 18:14:39
【问题描述】:

我终于将我的应用升级到 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 为我指明了正确的方向,我发现我最初的问题(我已经通过一个丑陋的 hack 解决了)是 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' => '/',
]);

【问题讨论】:

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


    【解决方案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']
            ]
        ],
        ...
    ]);
    

    【讨论】:

      【解决方案2】:

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

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

      https://github.com/cakephp/cakephp/pull/7938

      它使 CSRF 验证不仅在请求为 POSTPUTPATCHDELETE 时应用,而且在有可用请求数据时(无论它来自哪里)。

      【讨论】:

      • 很高兴知道将 cookie 值传递给请求数据会使 cookie 身份验证器无用,我写那行是因为我需要一个“修复”(实际上是一个愚蠢的 hack):如果我删除那行, 用户不再被识别并且 cookie 被删除。无论如何,我都遵循了其余的文档,除了我没有在 public $components 数组中加载 Cake3CookieAuth,而是我在初始化函数中通过 $this->loadComponent('Auth', .....) 动态加载组件...
      • 您为我指明了正确的方向,谢谢。但现在我面临真正的问题是:cookieAuth 没有从我的 cookie 中获取正确的字段,这就是它不起作用的原因......
      猜你喜欢
      • 2020-02-10
      • 2017-01-08
      • 2019-06-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多