Исключение TokenMismatchException в VerifyCsrfToken.php Laravel 5.2

#php #laravel #laravel-5.2

#php #laravel #laravel-5.2

Вопрос:

Я получил страшную ошибку VerifyCsrfToken в моем проекте Laravel 5.2.

Соответствующие коды приведены ниже:

Маршрут, который выдает ошибку

 Route::group(['middleware' => ['web']], function(){
    Route::resource('register', 'RegisterController');
});
  

При попытке зарегистрировать нового пользователя с помощью POST-запроса выдается ошибка

Контроллер регистра

 public function store(Request $request)
{
    return AppUser::create([
        'name' => $request->input('name'),
        'email' => $request->input('name'),
        'contact_number' => $request->input('contact_number'),
        'api_token' => str_random(60),
        'password' => $request->input('password'),
    ]);
}
  

Ожидаемый результат

 {
  "email": "test.name",
  "contact_number": "654987123",
  "updated_at": "2016-10-06 06:30:26",
  "created_at": "2016-10-06 06:30:26",
  "id": 4
}
  

Что отличает мой вопрос от других вопросов о несоответствии VerifyCsrf, так это то, что у меня нет формы для добавления {{ csrf_token() }} скрытого поля. Я только что отправил запрос с помощью Postman (и curl), и пользователь должен быть зарегистрирован.

Когда я выполняю следующее редактирование на app/Http/Middleware/VerifyCsrfToken.php

 protected $except = [
    '/*'
    //
];
  

Ошибка исчезает, и она работает так, как должна, но я не думаю, что это рекомендуемый способ.

Спасибо

Комментарии:

1. Чего именно вы пытаетесь достичь, и ДА, добавление «/ *» совсем не рекомендуется.

2. @GauravDave из приведенных выше кодов все, что я хочу сделать, это зарегистрировать пользователя (это был просто тест, а не окончательная версия), поэтому я отправляю необходимые данные в теле с помощью postman и link is localhost:8000/register . И я хочу, чтобы данные были введены в базу данных.

3. Кто проголосовал против этого :/

4. используете ли вы какой-нибудь javascript? или просто php? Если вы используете php, используйте Form helper, он подготовит для вас csrf.

5. <meta name="csrf-token" content="{{ csrf_token() }}"> добавьте это в свой блейд, если вы не используете форму.

Ответ №1:

Сохраните токен в корневом файле блейда. если вы используете только представление по умолчанию, то может быть в layout/main.blade.php

 <meta name="csrf-token" content="{{ csrf_token() }}">
  

Если вы используете jQuery, теперь вы можете указать ему включить токен во все заголовки запроса.

  $.ajaxSetup({
     headers: {
           'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
       }
   });
  

Если вы все еще получаете ошибки, выполните следующие действия: https://gist.github.com/ethanstenis/3cc78c1d097680ac7ef0

Комментарии:

1. Снимаю шляпу перед вами, сэр. Очень признателен. Я следовал инструкциям в сообщении github, и теперь он работает на Postman. Если я включу заголовок в свой http-запрос, мой api должен работать, верно?

2. я рад, что это помогло.