Laravel 5.5 Ajax Call 419 (알 수없는 상태)


145

나는 아약스 호출을하지만이 오류가 계속 발생합니다 :

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 아니요 양식이 없으므로 드롭 다운입니다.
Chris

{{csrf_field()}}양식에 추가 했 습니까 ?
Mr. Pyramid

3
드롭 다운은 양식을 통해 요청을하는 데 필요한 양식의 일부입니다
Mr. Pyramid

1
또는 다음과 같이 데이터에 csrf_token을 전달하십시오{'_token': {{csrf_token()}}}
Mr. Pyramid

답변:


301

헤드 섹션에서 이것을 사용하십시오.

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

ajax에서 csrf 토큰을 얻으십시오.

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

Laravel Documentation csrf_token을 참조하십시오


1
고마워, 그것은 나를 위해 일했다. 나는 아약스 호출에 'DELETE'메서드를 사용하려고 시도했으며 이것은 매력처럼 작동했습니다.
Salvo

4
이 정확한 코드가 설정되어 있지만 다음과 같은 상황에서 여전히 OP 문제가 발생합니다. 사용자가 로그인했지만 사이트가 오랫동안 유휴 상태입니다 (예 : 브라우저가 열린 상태에서 컴퓨터가 절전 모드로 전환됨). 이 경우 사용자가 컴퓨터로 돌아와 AJAX 호출을 시도하면이 오류가 발생합니다. 재 장전 후 모든 것이 정상으로 돌아옵니다. 누구든지 이것에 대한 해결책이 있습니까?
jovan

@jovan이를 쉽게 달성 할 수있는 두 가지 방법이 있습니다. 이 멋진 jquery 라이브러리 https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle을 살펴보십시오 . 둘째, ajax 요청에서 오류 코드 419가 반환되는지 확인한 다음 리디렉션하십시오.
riliwanrabo

@ jovan 나도 이것으로 고심하고 심지어 브라우저를 닫는 등 문제를 해결하지 못했습니다. 나는 그것을 고치는 방법을 찾아 내 post () 호출 안에 위에서 언급 한 'ajaxsetup ()'코드 줄을 넣음으로써 csrf 토큰이 올바르게 설정되었고 모든 것이 완벽하게 작동하기 시작했습니다.
SupaMonkey

2
그런데 왜 419 Unknown status? 419 Invalid CSRF token기존의 유용한 응답이 아닌 이유는 무엇 입니까? 그거 어디서 났어? 왜? 기타
Rudie

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

이것은 Kannan의 답변과 비슷합니다. 그러나 이렇게하면 토큰을 도메인 간 사이트로 보내지 않아야하는 문제가 해결됩니다. 로컬 요청 인 경우에만 헤더를 설정합니다.

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

정상적인 헤더 설정은 잠시 동안 효과가 있었지만 몇 달간 정상적으로 작동하면 무작위로 문제가 발생하기 시작했습니다. 왜 문제가 발생하지 않았는지 완전히 확신 할 수는 없지만이 솔루션은 훌륭하게 작동하여 문제를 해결했습니다.
Frank A.

7

귀하의 페이지에서 이것을 사용하십시오

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

그리고 당신의 아약스는 그것을 데이터에서 사용했습니다 :

_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

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 아약스를 제출 할 경우에도, 그렇지 않으면 내가 이상한 419 오류가있어, 모든 necesary입니다
Sr.PEDRO

3

을 가지고 있지만 csrf_tokenLaravel Policies을 사용하여 컨트롤러 작업을 인증 하면 419 응답도 할 수 있습니다. 이 경우 Policy클래스 에 필요한 정책 기능을 추가해야합니다 .


3

파일에서 .js를로드하는 경우 .js를 가져 오는 "main".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 Update, 결코 이것을 게시 할 것이라고 생각하지 않았지만 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로그인 할 때 내 dev 환경이 작동하지 않도록 true로 설정 했으므로 SESSION_SECURE_COOKIE=false dev .env 파일에 추가 하고 모든 것이 잘 작동합니다. 실수는 .env 파일에 변수를 추가하는 대신 session.php 파일을 변경하는 것이 었습니다.



0

이미 csrf 토큰을 보내고 있었지만이 오류가 발생했습니다. 서버에 남은 공간이 더 이상 없다는 것이 밝혀졌습니다.


0

이것은 양식이 필요하지 않은 경우에 효과적입니다.

헤더에서 이것을 사용하십시오 :

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

그리고 이것은 JavaScript 코드에서 :

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

0

콘솔에서 419 알 수없는 상태를 수정하는 간단한 방법은이 스크립트를 FORM에 넣는 것입니다. {{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.