web-dev-qa-db-ja.com

Laravel 4CSRFフォームをAjax呼び出しで送信

StackoverflowとLaravel 4の両方に慣れていないので、jquery ajaxを介してフォームを送信しようとしています。フォームをserializeArray()し、jsonを使用して送信します。laravelでは、ルートで送信されたcsrfトークンをチェックし、プロセス入力についてコントローラーに移動します.serializeArray()のように_token入力が配列にある場合、csrfチェックは機能しません。_token値を取得する必要があり、送信は別のものですajaxデータ。実行中のcsrfフィルターにhteフィールド_tokenの入力配列をチェックしてそれを使用するように指示する方法があるかどうか疑問に思っていますか?これが私のコードです:

ルート.php

Route::post('searchAjax', array('before' => 'csrf', 
                                'uses' => 'SearchController@searchAjax'));

これは、配列form [0] ['_ token]を読みたくないところですが、それを行うように指示する方法がわかりません。

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);
    }
});

Ajax呼び出しで{_token:token、form:form}を削除し、すでに_tokenを含む配列である 'form'を使用したいと思います。ここに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>

前もって感謝します。 :)

15
Saman

別のオプションは、jqueryを使用してヘッダーでトークンを送信するというKeltDockinsによって概説されたアプローチを使用することです。 jquery/javascriptブートストラップのどこかに追加:

$.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;
   }
});
28
glendaviesnz