Laravel 5.5 ajax call 419(不明なステータス)


145

私はajax呼び出しを行いますが、このエラーが発生し続けます。

419(不明な状況)

他の投稿でこれが何を引き起こしているのかわからないので、csrfトークンを使用して何かを行う必要がありますが、フォームがないため、これを修正する方法がわかりません。

私の電話:

$('.company-selector li > a').click(function(e) {
     e.preventDefault();

     var companyId = $(this).data("company-id");


      $.ajax({
          headers: {
          'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          },
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {},
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });
  });

私のルート:

Route::post('fetch-company/{companyId}', 'HomeController@fetchCompany');

私のコントローラーメソッド

/**
 * Fetches a company
 *
 * @param $companyId
 *
 * @return array
 */
public function fetchCompany($companyId)
{
    $company = Company::where('id', $companyId)->first();

    return response()->json($company);
}

最終的な目標は、応答から何かをhtml要素に表示することです。


4
これはありましたか?<meta name="csrf-token" content="{{ csrf_token() }}">
Hanlin Wang

@HanlinWangいいえ、ドロップダウンのフォームはありません。
クリス

{{csrf_field()}}フォームに追加しまし たか?
ピラミッド氏2017

3
ドロップダウンはフォームを介してそのリクエストを行うために必要なフォームの一部です
Mr. Pyramid

1
または、このようにデータでcsrf_tokenを渡します{'_token': {{csrf_token()}}}
Mr. Pyramid

回答:


300

これをヘッドセクションで使用します。

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

そしてajaxでcsrfトークンを取得します:

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

Laravelのドキュメントcsrf_tokenを参照してください


1
おかげで、うまくいきました。私はajax呼び出しに「DELETE」メソッドを使用しようとしていましたが、これは魅力のように機能しました。
Salvo

4
私はこの正確なコードを設定しましたが、次の状況でOPの問題が引き続き発生しています。ユーザーはログインしていますが、サイトが長期間アイドル状態のままです(たとえば、ブラウザーが開いたままコンピューターがスリープ状態になる)。この場合、ユーザーがコンピューターに戻ってAJAX呼び出しを試みると、このエラーが発生します。リロード後、すべてが正常に戻ります。誰かがこれに対する解決策を持っていますか?
ジョバン

@jovanこれを簡単に実現するには2つの方法があります。これらの素晴らしいjqueryライブラリhttps://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idleをご覧ください。次に、ajaxリクエストで、419のエラーコードを返すかどうかを確認してからリダイレクトします。
リリワンラボ2018年

@jovan私もこれに苦労し、ブラウザを閉じても問題は解決しませんでした。私はなんとかそれを修正する方法を見つけ、上記のコードの「ajaxsetup()」行を私のpost()呼び出し内に置くことにより、csrfトークンが適切に設定され、すべてが問題なく動作し始めました。
SupaMonkey

2
しかし、なぜ419 Unknown statusですか?なぜ、419 Invalid CSRF tokenまたはいくつかの既存の有用な応答がないのですか?それはどこから来たのですか?どうして?その他
ルディー

26

これを解決する別の方法は_token、ajaxデータのフィールドを使用して{{csrf_token()}}、ブレードの値を設定することです。これは私が最後に試した作業コードです。

$.ajax({
    type: "POST",
    url: '/your_url',
    data: { somefield: "Some field value", _token: '{{csrf_token()}}' },
    success: function (data) {
       console.log(data);
    },
    error: function (data, textStatus, errorThrown) {
        console.log(data);

    },
});

ヘッダー:{'X-CSRF-TOKEN':$( 'meta [name = "csrf-token"]')。attr( 'content')}、
Kamlesh

12

これは関南の答えに似ています。ただし、これにより、トークンがクロスドメインサイトに送信されない問題が修正されます。これは、ローカルリクエストの場合にのみヘッダーを設定します。

HTML:

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

JS:

$.ajaxSetup({
    beforeSend: function(xhr, type) {
        if (!type.crossDomain) {
            xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
        }
    },
});

通常のヘッダー設定はしばらくの間はうまくいきましたが、何ヶ月もうまく動作した後でランダムに問題が発生し始めました。どこからともなく問題が発生し始めた理由は完全にはわかりませんが、この解決策はうまく機能し、問題を解決しました。
フランク

7

これをあなたのページで使用してください

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

そしてあなたのajaxではそれをデータで使用しました:

_token: '{!! csrf_token() !!}',

あれは:

$.ajax({
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {
                   _token: '{!! csrf_token() !!}',
                 },
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });

ありがとう。


7

セッションドメインがアプリのURLやアプリへのアクセスに使用されているホストと一致していない可能性があります。

1.).envファイルを確認します。

SESSION_DOMAIN=example.com
APP_URL=example.com

2.)config / session.phpを確認します

値を確認して、値が正しいことを確認してください。


1
これは私にとって正しい解決策でした。非常にイライラする、HTTP 419コードはHTTP仕様と一致せず、非常に多くのことを意味する可能性があります。
Cobolt 2018年

5

上記の提案を既に行っても問題が解決しない場合。

env変数が次のことを確認します。

SESSION_SECURE_COOKIE

ローカルなどのSSL証明書がないfalse 場合に設定されます。


4

私の場合、送信されたフォームにcsrf_token入力を追加するのを忘れていました。だから私はこのHTMLをやった:

<form class="form-material" id="myform">
...
<input type="file" name="l_img" id="l_img">
<input type="hidden" id="_token" value="{{ csrf_token() }}">
..
</form>

JS:

//setting containers
        var _token = $('input#_token').val();
        var l_img = $('input#l_img').val();
        var formData = new FormData();
        formData.append("_token", _token);
        formData.append("l_img", $('#l_img')[0].files[0]);

        if(!l_img) {
            //do error if no image uploaded
            return false;
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "/my_url",
                contentType: false,
                processData: false,
                dataType: "json",
                data : formData,
                beforeSend: function()
                {
                    //do before send
                },
                success: function(data)
                {
                    //do success
                },
                error: function(jqXhr, textStatus, errorThrown) //jqXHR, textStatus, errorThrown
                {
                    if( jqXhr.status === "422" ) {
                        //do error
                    } else {
                        //do error
                    }
                }
            });
        }
        return false; //not to post the form physically

1
これ<input type="hidden" id="_token" value="{{ csrf_token() }}">は、私たちがWhitouth Ajaxを送信した場合でも必要です。それ以外の場合は、奇妙な419エラーが発生します
Sr.PEDRO

3

があっても、csrf_tokenLaravel Policiesを使用してコントローラーアクションを認証している場合は、419応答も返されます。その場合、Policyクラスに必要なポリシー関数を追加する必要があります。


3

ファイルから.jsをロードする場合は、.jsをインポートする「メイン」の.blade.phpファイルにcsrf_tokenで変数を設定し、その変数をajax呼び出しで使用する必要があります。

index.blade.php

...
...
<script src="{{ asset('js/anotherfile.js') }}"></script>
<script type="text/javascript">
        var token = '{{ csrf_token() }}';
</script>

anotherfile.js

$.ajax({
    url: 'yourUrl',
    type: 'POST',
    data: {
        '_token': token
    },
    dataType: "json",
    beforeSend:function(){
        //do stuff
    },
    success: function(data) {
        //do stuff
    },
    error: function(data) {
        //do stuff
    },
    complete: function(){
        //do stuff
    }
});

1

いくつかの参考文献=>

...
<head>
    // CSRF for all ajax call
    <meta name="csrf-token" content="{{ csrf_token() }}" />
</head>
 ...
 ...
<script>
    // CSRF for all ajax call
    $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>
...


1

csrfトークンを取得する必要があります。

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

同じ問題を実行した後は、このメタタグを追加するだけです< meta name="csrf-token" content="{{ csrf_token() }}" >

この後、エラーも発生します。Ajaxエラーを確認できます。次に、Ajaxエラーも確認します

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

1
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);

このコードスニペットをありがとうございます。このコードスニペットは、限られた、即時のヘルプを提供する可能性があります。適切な説明が大幅にこれは問題に良い解決策であり、他、同様の質問を将来の読者にそれがより便利になるだろう、なぜ示すことによって、その長期的な価値を向上させるであろう。回答を編集して、仮定を含めて説明を追加してください。
特定のパフォーマンス

1

2019 Laravel更新、これを投稿するとは思わなかったが、Laravel 5.8以降でブラウザフェッチAPIを使用している私のような開発者向け。headersパラメータを介してトークンを渡す必要があります。

var _token = "{{ csrf_token }}";
fetch("{{url('add/new/comment')}}", {
                method: 'POST',
                headers: {
                    'X-CSRF-TOKEN': _token,
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(name, email, message, article_id)
            }).then(r => {
                return r.json();
            }).then(results => {}).catch(err => console.log(err));

1

SESSION_SECURE_COOKIEログイン時にSESSION_SECURE_COOKIE=false 開発環境が機能しないようにtrueに設定していた ため、開発環境の.envファイルに追加しましたが、すべてうまく機能しました。


0

このエラーは、ajax送信リクエスト(POST)にcontentType:false、processData:false、これを含めるのを忘れた場合にも発生します。


0

すでにcsrfトークンを送信していたにもかかわらず、このエラーが発生しました。サーバーに空き領域がなくなったことがわかりました。


0

これは、フォームが不要な場合に最適です。

これをヘッダーで使用します。

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

そしてこれはあなたのJavaScriptコードで:

$.ajaxSetup({
        headers: {
        'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
        }
    });

0

コンソールで419の不明なステータスを修正する簡単な方法は、このスクリプトをフォーム内に配置することです。{{csrf_field()}}


0

これは私のために働きました:

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': "{{ csrf_token() }}"
  }
});

この後、通常のAJAX呼び出しを設定します。例:

    $.ajax({
       type:'POST',
       url:'custom_url',

       data:{name: "some name", password: "pass", email: "test@test.com"},

       success:function(response){

          // Log response
          console.log(response);

       }

    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.