Laravel APIでのCSRFトークンミスマッチの解決方法


CSRFトークンミスマッチエラーが発生するのは、主に2つの原因が考えられます。まず、LaravelのCSRFミドルウェアが正しく設定されていない場合です。次に、リクエストが正しく構成されていない場合です。

まず、CSRFミドルウェアが正しく設定されているか確認しましょう。Laravelでは、VerifyCsrfTokenミドルウェアがデフォルトで提供されており、app/Http/Middlewareディレクトリ内にあります。このミドルウェアは、リクエストのCSRFトークンを検証し、一致しない場合にエラーを返します。app/Http/Kernel.phpファイルで、VerifyCsrfTokenミドルウェアが適切に登録されていることを確認してください。

次に、リクエストが正しく構成されているか確認しましょう。Laravelでは、CSRFトークンを含む必要があります。Webアプリケーションの場合、フォームで@csrfディレクティブを使用してトークンを生成し、リクエストに含めることが推奨されます。APIの場合、リクエストヘッダーにX-CSRF-TOKENというキーでトークンを含める必要があります。

以下に、Laravel APIでのCSRFトークンミスマッチエラーを解決するためのいくつかの方法とコード例を示します。

  1. CSRFミドルウェアの設定を確認する

app/Http/Kernel.phpファイルで、VerifyCsrfTokenミドルウェアが適切に登録されていることを確認します。

protected $middlewareGroups = [
    'web' => [
        // ...
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],
    // ...
];
  1. CSRFトークンをリクエストに含める

Webアプリケーションの場合、フォームで@csrfディレクティブを使用してトークンを生成し、リクエストに含めます。

<form method="POST" action="/example">
    @csrf
    <!-- フォームフィールド -->
</form>

APIの場合、リクエストヘッダーにX-CSRF-TOKENというキーでトークンを含める必要があります。以下は、Axiosを使用したAPIリクエストの例です。

import axios from 'axios';
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
axios.defaults.headers.common['X-CSRF-TOKEN'] = csrfToken;
axios.post('/api/example', {
    // リクエストデータ
})
    .then(response => {
        // レスポンス処理
    })
    .catch(error => {
        console.error(error);
    });
  1. セッションドライバーの設定を確認する

Laravelでは、セッションドライバーの設定がCSRFトークンの生成と検証に影響を与えることがあります。config/session.phpファイルを確認し、ドライバーがcookieまたはfileに設定されていることを確認してください。これらのドライバーは、デフォルトでCSRFトークンの生成と検証に使用されます。

  1. セッションクッキーの設定を確認する

セッションクッキーの設定が正しく行われていない場合、CSRFトークンの生成と検証に問題が発生することがあります。config/session.phpファイルで、domainsecureの値を適切に設定していることを確認してください。

'secure' => env('SESSION_SECURE_COOKIE', true),
'domain' => env('SESSION_DOMAIN', null),
  1. ミドルウェアの適用範囲を確認する

Laravelでは、ミドルウェアを特定のルートグループに適用することができます。CSRFミドルウェアが正しく設定されているが特定のルートでエラーが発生する場合、ルートグループのミドルウェア設定を確認してください。

Route::middleware(['web', 'auth', 'csrf'])->group(function () {
    // ...
});
  1. CSRFトークンの手動生成と検証

最後の手段として、CSRFトークンの手動生成と検証を行う方法があります。以下のように、リクエストヘッダーとしてトークンを送信し、サーバーサイドで検証することができます。

import axios from 'axios';
const csrfToken = '手動で生成したトークン';
axios.defaults.headers.common['X-CSRF-TOKEN'] = csrfToken;
axios.post('/api/example', {
    // リクエストデータ
})
    .then(response => {
        // レスポンス処理
    })
    .catch(error => {
        console.error(error);
    });