Laravel 11 – отключить CSRF для маршрута

У меня есть маршрут, который служит конечной точкой веб-перехватчика, который вызывается удаленной службой, но вызовы, которые служба делает к веб-перехватчику, всегда терпят неудачу.

После некоторой проверки журналов службы я узнал, что служба получает код ошибки HTTP 419.

Раньше я добавлял исключения внутри свойства $except промежуточного программного обеспечения App\Http\Middleware\VerifyCsrfToken. Однако я использую Laravel 11 и больше не могу найти это промежуточное программное обеспечение. Каково решение этой проблемы?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
0
3 944
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Начиная с Laravel 11, промежуточное программное обеспечение VerifyCsrfToken больше не существует в скелете приложения.

Вместо этого вы можете указать, какие маршруты должны обходить процесс проверки CSRF, используя метод validateCsrfTokens(). Вы можете вызвать этот метод внутри обратного вызова метода withMiddleware() в вашем файле bootstrap/app.php. Например:

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        channels: __DIR__.'/../routes/channels.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->validateCsrfTokens(except: [
            'you-webhook-endpoint/action-name' // <-- exclude this route
        ]);
    })->create();

Дополнительную информацию можно найти в документации по адресу: https://laravel.com/docs/11.x/csrf#csrf-exclude-uris

Обновление: вы также можете вызвать статический метод except() в классе промежуточного программного обеспечения VerifyCsrfToken внутри метода boot() вашего класса AppServiceProvider следующим образом:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        \Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::except([
            'submit'
        ]);
    }
}

Этот ответ содержит больше информации и кажется более полным, чем принятый ответ, поэтому возникает вопрос, почему вы не приняли свой собственный ответ?

Douwe de Haan 16.04.2024 13:54

@DouwedeHaan Вы правы, я, должно быть, принял этот ответ по ошибке. В любом случае, я не принял свой собственный ответ, потому что хотел побудить других прийти и поделиться здесь своими ответами. Кроме того, мне кажется странным, что я принимаю собственный ответ на свой вопрос :D

Eyad Bereh 16.04.2024 14:03

Вполне допустимо принять свой собственный ответ! Давай, прими это :) Кудо ждет, чтобы другие тоже могли ответить!

Douwe de Haan 16.04.2024 14:05

Даже если VerifyCsrfToken больше не находится в приложении по умолчанию, вы все равно можете использовать его в L11, поскольку он все еще находится в фреймворке:

https://github.com/laravel/framework/blob/11.x/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php

Таким образом, вы можете использовать его, как и в предыдущей версии Laravel:

создайте собственное промежуточное ПО 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 = [
       'your-endpoint'
    ];
}

и просто добавьте его в свой middlewareGroupsнутри Kernel.php:

 protected $middlewareGroups = [
        'web' => [
            [...]
            \App\Http\Middleware\VerifyCsrfToken::class,

Да, это можно сделать и таким способом, но вам нужно будет зарегистрировать промежуточное ПО внутри файла bootstrap/app.php, поскольку файл app/Http/Kernel.php больше не существует в Laravel 11.

Eyad Bereh 05.04.2024 19:58

Я хотел бы процитировать ответ из документации Laravel:

Вы также можете исключить определенные маршруты, предоставив их URI validateCsrfTokens в файле bootstrap/app.php вашего приложения:

->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ]);
});

Источник: https://laravel.com/docs/11.x/csrf#preventing-csrf-requests

Не могли бы вы объяснить, чем ваш ответ лучше, чем тот, который предоставил Эйад Берех?

Douwe de Haan 16.04.2024 13:55

Добавьте свой URL-маршрут в bootstrap/app.php.

   ->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'your-except-url/*',
    ]);
})

Ссылка: https://laravel.com/docs/11.x/csrf#csrf-exclude-uris

Другие вопросы по теме