লারাভেল 5.5 আজাক্স কল 419 (অজানা অবস্থা)


145

আমি একটি এজ্যাক্স কল করি তবে আমি এই ত্রুটিটি পেতে থাকি:

419 (অজানা অবস্থা)

এর ফলে সিএসআরএফ টোকেন দিয়ে কিছু করা দরকার বলে আমি অন্যান্য পোস্টে এটি কী কারণে ঘটছে তা ধারণা নেই তবে আমার কোনও ফর্ম নেই তাই এটি কীভাবে ঠিক করতে হয় তা আমি জানি না।

আমার কল:

$('.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);
}

চূড়ান্ত লক্ষ্যটি এইচটিএমএল উপাদানটিতে প্রতিক্রিয়া থেকে কিছু প্রদর্শন করা।


4
তোমার এটা আছে? <meta name="csrf-token" content="{{ csrf_token() }}">
হ্যানলিন ওয়াং

@ হ্যানলিনওয়াং না আমার কাছে ফর্ম নেই এটি কেবল একটি ড্রপডাউন।
ক্রিস

আপনি কি {{csrf_field()}}আপনার ফর্ম যুক্ত করেছেন ??
মিঃ পিরামিড

3
ড্রপডাউন ফর্মের একটি অংশ যা আপনার ফর্মের মাধ্যমে অনুরোধ করতে হবে
মিঃ পিরামিড

1
অথবা আপনার ডেটাতে সিএসআরএফ_ টোকনটি পাস করুন{'_token': {{csrf_token()}}}
মিঃ পিরামিড

উত্তর:


300

মাথা বিভাগে এটি ব্যবহার করুন:

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

এবং অজ্যাক্সে সিএসআরএফ টোকেন পান:

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

লারাভেল ডকুমেন্টেশন সিএসআরএফ_ টোকেন উল্লেখ করুন


1
ধন্যবাদ, এটি আমার পক্ষে কাজ করেছে। আমি এজ্যাক্স কলের জন্য 'মোছা' পদ্ধতিটি ব্যবহার করার চেষ্টা করছিলাম এবং এটি মনোযোগের মতো কাজ করেছিল।
সালভো

4
আমার এই সঠিক কোডটি সেট আপ হয়েছে তবে আমি এখনও নিম্নলিখিত পরিস্থিতিতে ওপি-র সমস্যার মুখোমুখি হয়েছি: ব্যবহারকারী লগ ইন করেছেন তবে সাইটটি দীর্ঘ সময়ের জন্য অলস থাকে (উদাহরণস্বরূপ, ব্রাউজার খোলা থাকলে কম্পিউটার ঘুমিয়ে যায়)। এই ক্ষেত্রে, ব্যবহারকারী যখন কম্পিউটারে ফিরে আসে এবং একটি এজেএক্স কল চেষ্টা করে তখন এই ত্রুটি ঘটে। পুনরায় লোডের পরে, সমস্ত কিছু স্বাভাবিক অবস্থায় ফিরে আসে। যে কেউ এই একটি সমাধান আছে?
জোভান

@ জোভান এই দুটি উপায় আপনি সহজেই অর্জন করতে পারেন। এই দুর্দান্ত জ্যাকুরি লাইব্রেরিগুলি দেখুন https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle । দ্বিতীয়ত, আপনার এজাক্স অনুরোধে, এটি 419 এর একটি ত্রুটি কোড ফেরত পাঠিয়েছে কিনা তা পরীক্ষা করে দেখুন।
rilawanrabo

@ জোভান আমিও এটির সাথে লড়াই করে যাচ্ছিলাম এবং এমনকি ব্রাউজারটি বন্ধ করে দেওয়া ইত্যাদি সমস্যা সমাধান করবে না। আমি কীভাবে এটি ঠিক করতে পেরেছি এবং আমার পোস্টের () কলের সাথে উপরে উল্লিখিত 'অজ্যাক্সেটআপ ()' কোড লাইনটি রেখে - সিএসআরএফ টোকনটি সঠিকভাবে সেট করা হয়েছিল এবং সবকিছু নির্বিঘ্নে কাজ শুরু করে।
সুপমনকি

2
তবে কেন 419 Unknown status? 419 Invalid CSRF tokenবা না কিছু বিদ্যমান, দরকারী প্রতিক্রিয়া কেন? এটা কোথা থেকে এসেছে? কেন? ইত্যাদি
রুডি

26

এটি সমাধানের আরেকটি উপায় হ'ল _tokenএজ্যাক্স ডেটাতে ক্ষেত্রটি ব্যবহার করা {{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 'এক্স-সিএসআরএফ-টোকেন': $ ('মেটা [নাম = "সিএসআরএফ-টোকেন"]')। অ্যাট্রি ('সামগ্রী')},
কমলেশ

12

এটি কান্নানের উত্তরের অনুরূপ। তবে, এটি এমন একটি সমস্যার সমাধান করে যেখানে টোকনকে ক্রস-ডোমেন সাইটগুলিতে প্রেরণ করা উচিত নয়। এটি যদি স্থানীয় অনুরোধ হয় তবে এটি কেবল শিরোনাম সেট করবে।

এইচটিএমএল:

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

জাতীয়:

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

স্বাভাবিক শিরোলেখ সেটআপটি আমার জন্য কিছু সময়ের জন্য কাজ করেছিল, তবে কয়েক মাস কাজ করার পরে এলোমেলোভাবে সমস্যা হতে শুরু করে। আমি কোথাও থেকে কেন সমস্যা হতে শুরু করলাম তা সম্পর্কে আমি পুরোপুরি নিশ্চিত নই, তবে এই সমাধানটি দুর্দান্ত কাজ করেছে এবং বিষয়টি আমার জন্য স্থির করেছে।
ফ্রাঙ্ক এ 21

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

২) কনফিগারেশন / সেশন.এফপি পরীক্ষা করুন

মানগুলি সঠিক কিনা তা নিশ্চিত করার জন্য মানগুলি যাচাই করুন।


1
এটি আমার জন্য সঠিক সমাধান ছিল। খুব হতাশাব্যঞ্জক, এইচটিটিপি 419 কোডটি এইচটিটিপি স্পেকের সাথে মেলে না এবং এর অর্থ অনেকগুলি হতে পারে।
কোবোল্ট

5

যদি আপনি ইতিমধ্যে উপরের পরামর্শগুলি করে থাকেন এবং এখনও সমস্যাটি রয়েছে having

নিশ্চিত করুন যে এনভ ভেরিয়েবল:

SESSION_SECURE_COOKIE

স্থানীয় হিসাবে আপনার কাছে কোনও এসএসএল শংসাপত্র না false থাকলে সেট করা থাকে


4

আমার ক্ষেত্রে আমি জমা দেওয়া ফর্মটিতে csrf_ টোকন ইনপুট যুক্ত করতে ভুলে গেছি। সুতরাং আমি এই এইচটিএমএল করেছি:

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

জাতীয়:

//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() }}">আবশ্যকীয় এমনকি যদি আমরা একটি হোয়াইটথ এজ্যাক্স জমা করি তবে অন্যথায় আমি একটি অদ্ভুত 419 ত্রুটি পেয়েছি
সিনিডে পেড্রো

3

আপনার কাছে থাকা সত্ত্বেও csrf_token, লারাভেল ব্যবহার করে আপনি যদি আপনার কন্ট্রোলার ক্রিয়াকে প্রমাণীকরণ করেন তবে আপনার Policies419 প্রতিক্রিয়াও থাকতে পারে। সেক্ষেত্রে আপনার Policyক্লাসে আপনার প্রয়োজনীয় নীতি ফাংশন যুক্ত করা উচিত ।


3

আপনি যদি একটি ফাইল থেকে .js লোড করে থাকেন তবে আপনি নিজের "মূল" .blade.php ফাইলটিতে csrf_token সহ একটি ভেরিয়েবল সেট করতে হবে যেখানে আপনি .js আমদানি করছেন এবং আপনার এজাক্স কলটিতে ভেরিয়েবলটি ব্যবহার করতে পারেন।

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

কিছু refs =>

...
<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

আপনাকে সিএসআরএফ টোকেন পেতে হবে ..

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

একই ইস্যু করার পরে উত্থান হয়, কেবল এই মেটা ট্যাগ যুক্ত করুন< meta name="csrf-token" content="{{ csrf_token() }}" >

এর পরেও ত্রুটি দেখা দেয়, আপনি আজাক্স ত্রুটিটি পরীক্ষা করতে পারেন। তারপরে অ্যাজাক্স ত্রুটিটিও পরীক্ষা করে দেখুন

$.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 লারাভেল আপডেট, কখনও ভাবিনি যে আমি এটি পোস্ট করব তবে আমার মতো সেই বিকাশকারীদের জন্য ব্রাউজার ব্যবহার করে এপিআই এড়াতে লারাভেল ৫.৮ এবং তার উপরের ব্যবহার করতে পারেন। আপনাকে শিরোনামের প্যারামিটারের মাধ্যমে আপনার টোকেনটি পাস করতে হবে।

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 আমার ডিভ .env ফাইলটিতে যুক্ত করেছিলাম এবং সমস্ত কাজ সূক্ষ্ম হয় আমার ভুলটি .env ফাইলের সাথে ভেরিয়েবল যুক্ত করার পরিবর্তে সেশন.এফপি ফাইলটি পরিবর্তন করা হয়েছিল।


0

আপনি যদি এজ্যাক্স জমা দেওয়ার অনুরোধে (POST) বিষয়বস্তু টাইপ: মিথ্যা, প্রক্রিয়াডেট: মিথ্যা,


0

এই ত্রুটিটি পেয়েছি যদিও আমি ইতিমধ্যে সিএসআরএফ টোকেন প্রেরণ করেছি। দেখা গেল সার্ভারে আর কোনও স্থান অবশিষ্ট নেই।


0

আপনার ফর্মের প্রয়োজন নেই এমন ক্ষেত্রে এটি দুর্দান্ত কাজ করে।

শিরোনামে এটি ব্যবহার করুন:

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

এবং এটি আপনার জাভাস্ক্রিপ্ট কোডে:

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

0

আপনার কনসোলে একটি 419 অজানা অবস্থা স্থির করার একটি সহজ উপায় হ'ল এই স্ক্রিপ্টটি আপনার ফোর্মে রাখা inside {{সিএসআরএফ_ফিল্ড ()}}


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.