0

3.1+で発生した別の問題を解決したため、最終的にアプリをcakephp 3.2にアップグレードしました。

簡単に言えば、私はXety CookieAuthを使用して、ユーザーが私の Web サイトに戻ってきたときに自動ログインできるようにしています。すべてが 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' => '/',
]);
4

2 に答える 2

0

プラグインのドキュメントで提案されているようにコードを使用していません。Cookie を読み取って要求データに書き込むことは想定されていません。これにより、Cookie 認証が役に立たなくなります。リクエストデータを見つけて認証に使用します。

この変更により、エラーが発生するようになりました。

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

POSTリクエストが、PUTPATCHまたはの場合だけDELETEでなく、利用可能なリクエスト データがある場合はいつでも (それがどこから来たかに関係なく) CSRF 検証が適用されます。

于 2016-02-01T10:43:30.840 に答える