Szukaj…


Wprowadzenie

Przeanalizowałem, że stosunek błędu TokenMismatch jest bardzo wysoki. Ten błąd występuje z powodu niektórych głupich błędów. Istnieje wiele powodów, dla których programiści popełniają błędy. Oto kilka przykładów, tj. Brak _token na nagłówkach, brak _token przekazał dane podczas korzystania z Ajax, problem z uprawnieniami na ścieżce przechowywania, nieprawidłowa ścieżka przechowywania sesji.

Ustaw token na nagłówku

Ustaw token na <head> swojego default.blade.php .

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

Dodaj ajaxSetup na górze skryptu, który będzie dostępny wszędzie. Spowoduje to ustawienie nagłówków dla każdego wywołania ajax

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

Włącz token
etykietka

Dodaj poniższą funkcję do tagu <form> . Ta funkcja wygeneruje ukryte pole o nazwie _token i wypełni token wartości.

{{csrf_field()}}

Dodaj csrf_token () do ukrytego _token w atrybucie value. To wygeneruje tylko zaszyfrowany ciąg.

<input type="hidden" name="_token" value="{{csrf_token()}}"/> .

Sprawdź ścieżkę i uprawnienia do przechowywania sesji

Tutaj zakładam, że URL aplikacji projektu to APP_URL=http://project.dev/ts/toys-store

  1. Ustaw uprawnienia do zapisu w storage_path('framework/sessions') .
  2. Sprawdź ścieżkę swojego projektu laravel 'path' => '/ts/toys-store', katalog główny projektu laravel.
  3. Zmień nazwę swojego pliku cookie 'cookie' => 'toys-store',
return [
    'driver' => env('SESSION_DRIVER', 'file'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => null,
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'toys-store',
    'path' => '/ts/toys-store',
    'domain' => null,
    'secure' => false,
    'http_only' => true,
];

Użyj pola _token na Ajaxie

Istnieje wiele sposobów wysyłania _token podczas połączenia AJAX

  1. Uzyskaj wszystkie wartości pola wejściowego w <form> używając var formData = new FormData($("#cart-add")[0]);
  2. Użyj $("form").serialize(); lub $("form").serializeArray();
  3. Dodaj _token ręcznie do data Ajax. using $('meta[name="csrf-token"]').attr('content') lub $('input[name="_token"]').val() .
  4. Możemy ustawić jako nagłówek dla określonego wywołania Ajax, takiego jak poniższy kod.
$.ajax({
    url: $("#category-add").attr("action"),
    type: "POST",
    data: formData,
    processData: false,
    contentType: false,
    dataType: "json",
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow