8

Laravel の csrf トークンに問題があります。要求 POST (axios 経由) が419コード「CSRF トークンの不一致」を返すことがありますが、要求ヘッダーには CSRF および XSRF トークンが含まれています。興味深いことに、シークレット モードでは発生しません。

ここに画像の説明を入力

App.blade:

<meta name="csrf-token" content="{{ csrf_token() }}">

ブートストラップ.js:

window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';


let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

カーネル.php:

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\Localization::class,
        ],

キャッシュと設定をクリアしようとしましたが、結果はありませんでした。それを修正する方法はありますか?

4

4 に答える 4

5

この問題が発生しました。原因は、axios ヘッダーが設定されていないことでした。コンポーネント内の軸オブジェクトにそれらを設定しても、問題は解決しませんでした。オブジェクトが定義された後にヘッダーを設定すると、問題が解決しました。

ブレード ビューで、次を追加します。

<script>window.Laravel = {csrfToken: '{{ csrf_token() }}'}</script>

bootstrap.js ファイルで、宣言後window.axios = require('axios');に次を追加します。

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = window.Laravel.csrfToken;
于 2020-12-09T14:28:03.440 に答える
2

時々?!のように聞こえexpired tokenます。

で作業しているときincognito tabsは、新しいトークンがあります。

location.reload()あなたが得ているときに試してみてください419 error code。すべてがうまくいきます。

于 2019-12-23T00:24:27.343 に答える
0

別のWebサイト(webB)でlaravelデータベース(webA)からデータを取得するときに問題が発生しました。いくつかの調査の後、Laravel にはこのシナリオに対する 1 つの解決策が既にあることがわかりました: https://laravel.com/docs/5.7/csrfは、別の Web からアクセスしているルートを除外します。VerifyCsrfToken.php で、ルートまたはページを除外します。

<?php
    
    namespace App\Http\Middleware;
    
    use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
    
    class VerifyCsrfToken extends Middleware
    {
        /**
         * The URIs that should be excluded from CSRF verification.
         *
         * @var array
         */
        protected $except = [
            'stripe/*',
            'http://example.com/foo/bar',
            'http://example.com/foo/*',
        ];
    }
于 2022-01-31T19:58:38.943 に答える