Laravel 4 Форма CSRF отправляется через вызов Ajax

Я новичок как в Stackoverflow, так и в Laravel 4, Я пытаюсь представить форму через jquery ajax. я serializeArray() форму и использовать json для ее отправки. В laravel, на маршрутах, я проверяю переданный токен csrf, перейдите к моему контроллеру для ввода процесса. Проверка csrf не работает, когда вход _token находится в массиве, как с serializeArray(). Мне нужно получить значение _token и отправить его как отдельную ajax-информацию. Мне интересно, есть ли способ указать фильтр csrf, где бы он ни работал, чтобы проверить входной массив для поля hte _token и использовать его? вот мой код:

routes.php

Route::post('searchAjax', array('before' => 'csrf', 
                                'uses' => '[email protected]'));

Здесь я не хочу читать форму массива [0] ['_ токен], но я не знаю, как это сказать.

index.js
    var form = $('#search').serializeArray();
var token = $('#search > input[name="_token"]').val();
$.ajax({
    type: 'post',
    url: 'searchAjax',
    dataType: 'json',
    data: { _token: token, form: form },
    success: function(data) {
        for(var key in data)
        {
            //alert(key)
        }
        //alert(data.message);
    }
});

Я хочу избавиться от {_token: token, form: form} в вызове ajax и просто иметь "форму", которая уже есть массив с _token. вот html:

<form id="search" class="form-horizontal" accept-charset="UTF-8" action="http://testing:998/search" method="POST">
  <input type="hidden" value="6GBbv9LmnOdL8UcOsm8DDJ4Bfi6eGcQRlC9SPdL4" name="_token">
<div class="control-group">
  <label class="control-label" for="title">Book Titles</label>
  <div class="controls">
    <input id="title" class="input" type="text" value="click to search book titles" name="title">
  </div>
</div>
<div class="control-group">
<div class="control-group">
<div class="control-group">
</form>

Спасибо заранее.:)

Ответы

Ответ 1

Другой вариант - использовать подход, описанный Kelt Dockins, который должен отправить токен в заголовках, используя jquery, например. где-то в вашем jquery/javascript bootstrapping добавьте:

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

Это даст токен CSRF из тега метаданных заголовка и включит его в заголовки каждого запроса ajax. Затем вам нужно добавить метаданные и токен в свои шаблоны Laravel, например.

<head>
    <title>My Page</title>
    <meta name="csrf-token" content="<?= csrf_token() ?>">

Вам также необходимо изменить фильтр CSRF, чтобы проверить заголовок запроса ajax, а также по умолчанию Input:: get ('_ token')

Route::filter('csrf', function()

{
   $token = Request::ajax() ? Request::header('X-CSRF-Token') : Input::get('_token');
   if (Session::token() != $token) {
      throw new Illuminate\Session\TokenMismatchException;
   }
});