दिलचस्प पोस्ट
क्या आप mysql में WHERE खंड में एक उपनाम का उपयोग कर सकते हैं? 64-बिट विंडोज पर थोड़ी सा आकार क्या है? ईएक्स के उच्च बाइट्स में एक रजिस्टर क्यों नहीं है? क्रोम देव उपकरण – "आकार" बनाम "सामग्री" सामग्री को फिट करने के लिए मैं एक UIScrollView को कैसे आकार देता हूं क्या वीबी.नेट में एक सशर्त त्रिगुट ऑपरेटर है? धीमापन पाया जब बेस 64 छवि का चयन करें और डेटाबेस से सांकेतिक शब्दों में बदलना मैं जावा HTTPResponse से JSON को कैसे पार्स कर सकता हूं? क्या अस्थायी चर मेरे प्रोग्राम को धीमा कर देते हैं? एंड्रॉइड ओपन और फाइल्स को Google ड्राइव एसडीके में / से सहेजें किसी वस्तु के लिए अधिकतम मूल्य वाले ऑब्जेक्ट को मैं कैसे लौटा सकता हूं? प्राइम नंबर के बाद एन प्राइम्स खोजें, बिना किसी फ़ंक्शन का उपयोग किए, जो प्राइमलिटी की जांच करता है अजगर मॉड्यूल पथ को पुनर्प्राप्त करना सबप्रोसेस बदलती निर्देशिका गिट रीसेट –हार्ड और रिमोट रिपॉजिटरी

कैसे Laravel एपीआई का उपयोग कर AngularJS फॉर्म में csrf_token () भेजना है?

मैं एक कोणीय + लार्वल आराम आवेदन का निर्माण करने की कोशिश कर रहा हूं मैं अपने डेटाबेस के दृश्य प्राप्त कर सकता हूँ जब मैं नए आइटम जोड़ने का प्रयास करता हूँ मुझे 500 error मिल रही है जो मुझे बेमेल सीएसआरएफ टोकन बता रही है। मेरा रूप लेआउट है:

 <form class="form-horizontal" ng-submit="addItem()"> <input type="text" ng-model="itemEntry" placeholder="Type and hit Enter to add item"> </form> 

मैं इस तरह से डेटाबेस में आइटम जोड़ने का प्रयास करता हूं:

 $scope.addItem = function(CSRF_TOKEN) { $http.post('/shop', { text: $scope.itemEntry, csrf_token: CSRF_TOKEN} ).success(function(data, status) { if(data) { var last = _.last($scope.items); _token = CSRF_TOKEN; $scope.items.push({text: $scope.itemEntry, bought: false, id: (last.id + 1) }); $scope.itemEntry = ''; console.log($scope.items); } else { console.log('There was a problem. Status: ' + status + '; Data: ' + data); } }).error(function(data, status) { console.log('status: ' + status); }); } 

यहां मेरा फ़िल्टर है जिसे मैं अपने आवेदन के लिए उपयोग करता हूं:

 Route::filter('csrf', function() { if (Session::token() != Input::get('_token')) { throw new Illuminate\Session\TokenMismatchException; } }); 

मेरे ब्लेड विचारों में मैं इसका उपयोग करता हूं और यह काम करता है:

 <input type="hidden" name="_token" value="{{ csrf_token() }}" /> 

जब मैं html रूपों का उपयोग करता हूं तो मैं csrf_token कैसे भेज सकता हूं?

धन्यवाद

1 संपादित करें: इस तरह से अनुरोध पोस्ट करने के लिए शीर्षलेख जोड़ना त्रुटियों को नहीं देता है

  $http({ method : 'POST', url : '/shop', data : $scope.itemEntry, // pass in data as strings headers : { 'Content-Type': 'application/x-www-form-urlencoded' } }); 

वेब के समाधान से एकत्रित समाधान "कैसे Laravel एपीआई का उपयोग कर AngularJS फॉर्म में csrf_token () भेजना है?"

एक विकल्प सीएसआरएफ टोकन को एक स्थिर के रूप में इंजेक्ट करना होगा। अपने सिर टैग में निम्नलिखित जोड़ें:

 <script> angular.module("app").constant("CSRF_TOKEN", '{{ csrf_token() }}'); </script> 

तब आपके मॉड्यूल के तरीकों में यह आवश्यक हो सकता है जब इंजेक्ट किया जा सकता है।

 app.factory("FooService", function($http, CSRF_TOKEN) { console.log(CSRF_TOKEN); }; 

हो सकता है कि आपको इस नमूने के स्रोत कोड पर देखने की दिलचस्पी होगी Laravel + AngularJS प्रोजेक्ट

रुबेन मारीज़ो काम करता है द्वारा स्वीकार किए जाते हैं समाधान, हालांकि मुझे लगता है कि मुझे एक वैकल्पिक समाधान मिला है जो मुझे लगता है कि बेहतर है

इस तरह आपको एचटीएमएल स्क्रिप्ट से अपने एन्जुलरज ऐप में डेटा पास नहीं करना पड़ता है और इसमें चिंताओं का बेहतर जुदाई है। उदाहरण के तौर पर यह आपके लार्ज एपीपी को सिर्फ एपीआई के रूप में रखने की अनुमति देता है।

मेरे समाधान में एक एपीआई अनुरोध के माध्यम से सीएसआरएफ टोकन प्राप्त करना शामिल है और एक स्थिर के रूप में इस मान को सेट करना शामिल है।

इसके अलावा, जब जरूरत पड़ने पर सीएसआरएफ टोकन के इंजेक्शन के बजाय, आप टोकन को एक डिफ़ॉल्ट हेडर में सेट करते हैं जो किसी भी एपीआई http अनुरोध पर सर्वर द्वारा चेक कर लेगा।

उदाहरण लारवेल को दिखाता है, हालांकि किसी भी गंभीर रूपरेखा को कुछ इसी तरह की पेशकश करने में सक्षम होना चाहिए।

LARAVEL में सीएसआरएफ रूट:

 // Returns the csrf token for the current visitor's session. Route::get('api/csrf', function() { return Session::token(); }); 

before => 'api.csrf' फ़िल्टर के साथ मार्गों की रक्षा करना

 // Before making the declared routes available, run them through the api.csrf filter Route::group(array('prefix' => 'api/v1', 'before' => 'api.csrf'), function() { Route::resource('test1', 'Api\V1\Test1Controller'); Route::resource('test2', 'Api\V1\Test2Controller'); }); 

api.csrf फिल्टर

 // If the session token is not the same as the the request header X-Csrf-Token, then return a 400 error. Route::filter('api.csrf', function($route, $request) { if (Session::token() != $request->header('X-Csrf-Token') ) { return Response::json('CSRF does not match', 400); } }); 

AngularJS सामान app.js में यह डाल:

अवरुद्ध संस्करण:

 var xhReq = new XMLHttpRequest(); xhReq.open("GET", "//" + window.location.hostname + "/api/csrf", false); xhReq.send(null); app.constant("CSRF_TOKEN", xhReq.responseText); app.run(['$http', 'CSRF_TOKEN', function($http, CSRF_TOKEN) { $http.defaults.headers.common['X-Csrf-Token'] = CSRF_TOKEN; }]); 

गैर-ब्लॉकिंग संस्करण

 var xhReq = new XMLHttpRequest(); xhReq.open("GET", "//" + window.location.hostname + "/api/csrf", true); xhReq.onload = function(e) { if (xhReq.readyState === 4) { if (xhReq.status === 200) { app.constant("CSRF_TOKEN", xhReq.responseText); app.run(['$http', 'CSRF_TOKEN', function($http, CSRF_TOKEN) { $http.defaults.headers.common['X-Csrf-Token'] = CSRF_TOKEN; }]); } } }; xhReq.send(null); 

अब CSRF_TOKEN स्थिरांक AngularJS ऐप से सभी http अनुरोधों में एक हेडर के रूप में इंजेक्शन है और सभी एपीआई मार्ग संरक्षित हैं।

यदि आप लैरेल 5 का उपयोग करते हैं, तो सीज़आरएफ टोकन को कोणीय HTTP हेडर में जोड़ने की आवश्यकता नहीं है

कोणीय के साथ 5 Laravel स्वचालित रूप से यह आपके लिए करते हैं

http://laravel.com/docs/5.1/routing#csrf-x-xsrf-token

मुझे लगता है कि मेरा समाधान कम दर्द है और बहुत अधिक लचीला है, विशेष रूप से यह कर्म पर अपना ऐप परीक्षण करने के बारे में सोचता है।

सबसे पहले यह कोड आपके मास्टर व्यू जोड़ें

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

हमने सीआरआरएफ टोकन को HTML लिंक को बिना जोड़ते हुए सहेजा है।

अब हम सीएनआरएफ टोकन द्वारा कांगुल जेएस ऐप के सभी अनुरोधों की रक्षा करते हैं

 /** * * when it thinks testing your app unit test with Karma, * this solution was better than getting token via AJAX. * Because low-level Ajax request correctly doesn't work on Karma * * Helper idea to me : * http://stackoverflow.com/questions/14734243/rails-csrf-protection-angular-js-protect-from-forgery-makes-me-to-log-out-on/15761835#15761835 * */ var csrftoken = (function() { // not need Jquery for doing that var metas = window.document.getElementsByTagName('meta'); // finding one has csrf token for(var i=0 ; i < metas.length ; i++) { if ( metas[i].name === "csrf-token") { return metas[i].content; } } })(); // adding constant into our app yourAngularApp.constant('CSRF_TOKEN', csrftoken); 

हमें कोणीय के लिए डिफ़ॉल्ट एचटीएच हेडर सेटअप करने की जरूरत है चलो हमारे सीएसआरएफ टोकन को कोणीय के शीर्षलेखों में जोड़ते हैं

 /* * App Configs */ blog.config(['$httpProvider', 'CSRF_TOKEN', function($httpProvider, CSRF_TOKEN) { /** * adds CSRF token to header */ $httpProvider.defaults.headers.common['X-CSRF-TOKEN'] = CSRF_TOKEN; }]); 

आखिरकार हमें लार्वेल की तरफ से इस बदलाव के लिए नए फिल्टर की ज़रूरत है ..

 Route::filter('csrfInHeader', function($route, $request) { if (Session::token() !== (string) $request->header('X-CSRF-TOKEN') ) { throw new Illuminate\Session\TokenMismatchException; } }); 

"csrfInHeader" फिल्टर को कोणीय ऐप द्वारा सभी http अनुरोध की जांच होगी आपको प्रत्येक अनुरोध के लिए सीएसआरएफ टोकन जोड़ने की आवश्यकता नहीं है। इसके अलावा यदि आप कर्मा द्वारा अपने ऐप का परीक्षण करते हैं, तो आप परीक्षण पर सीएसआरएफ टोकन पाने का प्रयास नहीं करेंगे ..