Почему Laravel Api возвращает код статуса 419 в методе POST и PUT?

Я пытаюсь создать Restful api, используя laravel и создаю свой контроллер, используя php artisan make: controller RestController и это мой контроллер. Код:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class RestController extends Controller
{
    private $arr = array(
            array("name"=>"jon", "family"=>"doe"),
            array("name"=>"jhon", "family" => "doue")
        );
    public function index(){
        return json_encode($this->arr);
    }

    public function store(Request $request){
        return "oops!!";
    }

    public function update (Request $request, $id){
        return "test";
    }

}

и я добавляю эту строку кода для создания этого маршрута в файле маршрутов /web.php

Route::resource('person', 'RestController');

когда я пытаюсь проверить этот api на GET/person, он работает нормально, но на столбе и поставке я получаю код статуса 419 из laravel.

Ответ 1

если вы разрабатываете rest apis, лучше не добавлять токен. Если вы используете 5.4 или 5.5, вы можете использовать api.php вместо web.php. В api.php вам не нужна проверка токена в почтовом запросе.

если вы используете web.php, то вы используете exculde token. Вот официальная документация

Исключение URI из CSRF Protection

Иногда вы можете исключить набор URI из защиты CSRF. Например, если вы используете Stripe для обработки платежей и используете свою систему webhook, вам нужно будет исключить ваш маршрут обработчика веб-узлов Stripe из CSRF-защиты, поскольку Stripe не будет знать, что маркер CSRF отправляет на ваши маршруты.

Как правило, вы должны размещать эти маршруты вне группы промежуточного программного обеспечения Интернета, которые RouteServiceProvider применяется ко всем маршрутам в файле routes/web.php. Однако вы также можете исключить маршруты, добавив свои URI к свойству $ except из промежуточного ПО VerifyCsrfToken:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
    ];
}

для справки

https://laravel.com/docs/5.5/csrf

Ответ 2

Насколько мне известно, есть два метода, чтобы решить эту проблему

Способ 1: - добавить токен CsrF

Способ 2: исключение URI из защиты CSRF

Как пользоваться

Метод 1: добавьте еще одну переменную в ваш запрос POST.

"_token": "{{ csrf_token() }}"

Пример для Ajax

 req = $.ajax({
    type: "POST",
    url: "/search",
    data: {'key' : 'value',
    "_token": "{{ csrf_token() }}",},
    dataType: "text",
    success: function(msg){

    }
});

Пример использования форм

<input type="hidden" name="_token" id="token" value="{{ csrf_token() }}">
Метод

-2  В следующем месте есть файл с именем "VerifyCsrfToken"

yourProjectDirectory --> app->Http--> Middleware

Добавьте свой URL следующим способом

 protected $except = [

            'url1/',
            'url2/',

 ];

Когда использовать

  • Если вы являетесь владельцем (полного контроля) API, используйте метод 1, поскольку CSRF TOKEN повышает безопасность вашего приложения.

  • Если вы не можете добавить токен CSRF, как в случае, если вы используете какие-либо сторонние API, веб-хуки и т.д. Перейдите к методу-2.

Ответ 3

Я решил эту проблему, изменив настройки кэша сервера. Вы можете отключить все свои системы кэширования (Nginx, Cloudflare,...), чтобы проверить это, а затем включите его, применив QueryString + Cookie, чтобы предотвратить кэширование страницы со старым csrf token.