[Laravel] Ajax を使用したら、ステータス 419 が返ってくるのを解消する

2019年6月7日ITLaravel, PHP

jQuery の ajax で post したら、ステータス 419 という見慣れぬステータスコードが返ってまいりました。

laravel-ajax-4191.png

wiki の HTTPステータスコードにも載っていなかったのですが、Laravel のフレームワーク内で例外として出力してるようですね。

参考:
HTTPステータスコード

ここで、419というステータスコードを当ててるみたいです。

vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php

protected function prepareException(Exception $e)
{
    if ($e instanceof ModelNotFoundException) {
        $e = new NotFoundHttpException($e->getMessage(), $e);
    } elseif ($e instanceof AuthorizationException) {
        $e = new AccessDeniedHttpException($e->getMessage(), $e);
    } elseif ($e instanceof TokenMismatchException) {
        $e = new HttpException(419, $e->getMessage(), $e);
    }

    return $e;
}

ミドルウェアグループ の web に VerifyCsrfToken が設定されているので、それは csrf対策として、使い続けたいので、、

[検証環境]
PHP 7.2.4
MySQL 5.7.22
Laravel 5.5.40

解決方法1

post の data に キー:「_token」、バリュー:「csrf_token」を入れる

<script type="text/javascript">
    $('#ajax').on('click',function(){
        $.ajax({
            url:'test',
            type:'POST',
            data:{
                userid:$('#userid').val(),
                passward:$('#passward').val(),
                _token: '{{ csrf_token() }}'
            }
        })
        // Ajaxリクエストが成功した時発動
        .done( (data) => {
            console.log(data);
        })
        // Ajaxリクエストが失敗した時発動
        .fail( (data) => {
            $('.result').html(data);
            console.log(data);
        })
        // Ajaxリクエストが成功・失敗どちらでも発動
        .always( (data) => {

        });
    });
</script>

解決方法2

meta タグに設定されている csrf-token を post のヘッダーに付ける
(Laravel のデフォルトのテンプレート は meta タグに csrf-token は設定されてますが、必要に応じて設定ください。)

<meta name="csrf-token" content="{{ csrf_token() }}">
<script type="text/javascript">
    $('#ajax').on('click',function(){
        $.ajax({
            url:'test',
            type:'POST',
            headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
            data:{
                userid:$('#userid').val(),
                passward:$('#passward').val()                            }
        })
[省略]

これで例外を出さなくなりました。

laravel-ajax-4191

参考:
Laravel 5.5 ajax call 419 (unknown status)

以上になります。

スポンサーリンク

Posted by nobuhiro harada