У меня есть маршрут, который служит конечной точкой веб-перехватчика, который вызывается удаленной службой, но вызовы, которые служба делает к веб-перехватчику, всегда терпят неудачу.
После некоторой проверки журналов службы я узнал, что служба получает код ошибки HTTP 419.
Раньше я добавлял исключения внутри свойства $except
промежуточного программного обеспечения App\Http\Middleware\VerifyCsrfToken
. Однако я использую Laravel 11 и больше не могу найти это промежуточное программное обеспечение. Каково решение этой проблемы?
Начиная с 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'
]);
}
}
@DouwedeHaan Вы правы, я, должно быть, принял этот ответ по ошибке. В любом случае, я не принял свой собственный ответ, потому что хотел побудить других прийти и поделиться здесь своими ответами. Кроме того, мне кажется странным, что я принимаю собственный ответ на свой вопрос :D
Вполне допустимо принять свой собственный ответ! Давай, прими это :) Кудо ждет, чтобы другие тоже могли ответить!
Даже если VerifyCsrfToken больше не находится в приложении по умолчанию, вы все равно можете использовать его в L11, поскольку он все еще находится в фреймворке:
Таким образом, вы можете использовать его, как и в предыдущей версии 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.
Я хотел бы процитировать ответ из документации 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
Не могли бы вы объяснить, чем ваш ответ лучше, чем тот, который предоставил Эйад Берех?
Добавьте свой URL-маршрут в bootstrap/app.php.
->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(except: [
'your-except-url/*',
]);
})
Ссылка: https://laravel.com/docs/11.x/csrf#csrf-exclude-uris
Этот ответ содержит больше информации и кажется более полным, чем принятый ответ, поэтому возникает вопрос, почему вы не приняли свой собственный ответ?