У меня есть API-запрос с данными о сообщениях; скажем, это процесс входа в систему.
С расширением Postman от Chrome я отправляю через POST имя пользователя и пароль для входа пользователя в систему. Но я получил это сообщение:
Illuminate \ Session \ TokenMismatchException
В моем базовом контроллере у меня есть:
/** * Initializer. * * @return void */ public function __construct() { // CSRF Protection $this->beforeFilter('csrf', array('on' => 'post')); // Layouts/Notifications $this->messageBag = new Illuminate\Support\MessageBag; }
Когда я удаляю строку с помощью beforeFilter, все работает нормально. Но это не может быть решением. Любой запрос POST получит это сообщение об ошибке. Я ЗНАЮ, что мне нужно это. Но как я получаю этот токен, когда звоню из API? Я знаю, что я могу создать токен внутри Laravel, но как это сделать, когда я вызываю извне через API?
Обычно API используются для запросов на межсайтовый сайт. Поэтому ваша защита CSRF бессмысленна.
Если вы не собираетесь использовать кросс-сайт, скорее всего, API не является оптимальным решением для того, что вы пытаетесь сделать. В любом случае, вы можете создать конечную точку API, которая возвращает токен.
public function getToken(){ return Response::json(['token'=>csrf_token()]); }
Если вы хотите отключить CSRF-защиту для некоторых методов , вы можете использовать except
или only
.
$this->beforeFilter('csrf', array('on' => 'post', 'except'=>array('methodName', 'anotherMethod') ));
Пожалуйста, обратитесь к официальной документации Laravel .
Абсолютно не используйте этот подход.
Откройте класс VerifyCsrfToken
и определите свойство $except
которое будет содержать массив маршрутов, где защита CSRF не будет применяться.
Пример:
<?php declare(strict_types=1); namespace App\Http\Middleware; use Closure; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; class VerifyCsrfToken extends BaseVerifier { protected $except = [ 'api/auth/login', 'api/*', // this works as well ]; /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return parent::handle($request, $next); } }
просто послушайте это. Только перед 30 минутой я столкнулся с этой же проблемой. Теперь он решил. просто попробуйте это.
Goto App -> HTTP-> Kernel
откройте файл ядра.
там вы можете увидеть: \ App \ Http \ Middleware \ VerifyCsrfToken :: class,
просто отключите этот конкретный код, используя //
Это! Это сработает!
Чтобы вы могли удалить промежуточное программное обеспечение из вызова API (если вы этого хотите).