Я работаю с проектом Slim 3 и установил пакет CSRF ("slim / csrf": "^ 0.8.2",)
Для отправки запроса POST я использую почтальона. При отправке действия я получаю следующую ошибку:
Неудачная проверка CSRF!
Вот мои маршруты API (в данном случае, сфокусируйтесь на маршруте POST):
<?php
/* RESTful endpoints or routes */
use App\Controllers\api\users\UserController;
$app->group('/api',function () use ($app){
$app->group('/users', function () {
$this->get('', UserController::class.':index');
$this->get('/{id}', UserController::class.':show');
$this->post('', UserController::class.':store');
});
});
Вот контроллер, который должен получить информацию из запроса POST, где я получаю сообщение об ошибке:
//Save a user via API
public function store($request,$response,$args)
{
//todo: validation!
var_dump($request->getParams());//todo: CSRF check failed!
die();
}
Здесь я зарегистрировал компонент CSRF:
//Register the CSRF Component
$container['csrf'] = function ($container){
return new \Slim\Csrf\Guard();
};
Я попробовал это решение: https://stackoverflow.com/a/48266488/1883256, но оно не сработало.
Есть ли обходной путь, чтобы заставить его работать? Как запретить запуск CSRF на моих маршрутах API?
* Решено *
Как и предполагал Zamrony P. Juhara , я решил применить CSRF к веб-маршрутам, за исключением маршрутов API.
Группировка всех моих веб-маршрутов:
$app->group('',function ()use($app,$container){
/* ******* H O M E ********** */
require __DIR__ . '/web/home/home.php';
/* ********** T O P I C s ********** */
require __DIR__ . '/web/topics/topics.php';
/* ********** C O N T A C T *********** */
require __DIR__ . '/web/contact/contact.php';
/* And so on and etcetera ....*/
/* ********************************************************************************* */
})->add($container->get('csrf'));//Adding CSRF protection only for web routes
И, например, внутри файла маршрутов topics.php
, который у меня есть:
$app->group('/topics',function(){
$this->get('',TopicController::class.':index');
$this->get('/{id}',TopicController::class.':show')->setName('topics.show');
});
А что касается маршрутов API, они остаются теми же.
Наконец, внутри моего контейнера я прокомментировал следующее:
//$app->add($container->get('csrf')); //I've commented this line in order to add CSRF for specific routes (all except APIs ones)