2016-09-10 13 views
18

में एक्सेस-कंट्रोल-ऑर्डर-मूल हेडर प्रतिक्रिया जोड़ना मैं लार्वेल के लिए नया हूं और ओएथ 2.0 पासवर्ड अनुदान के साथ कुछ लार्वेल 5.3 पासपोर्ट प्रोजेक्ट कर रहा हूं। जब मैं पैरामीटर के साथ एपीआई को घुमाता हूं तो यह टोकन के साथ प्रतिक्रिया देता है। हालांकि, ब्राउज़र में इसे एक अतिरिक्त सुरक्षा की आवश्यकता है कि एंडपॉइंट जोड़ना चाहिए क्योंकि मेरा अनुरोध स्थानीयहोस्ट से आ रहा है जबकि एपीआई मेरे वीएम में स्थित है। यहाँ त्रुटि है:लार्वेल 5.3 पासपोर्ट

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 400. 

मुझे पता है कि समस्या क्या है, लेकिन मैं नहीं जानता कि जहां कि शीर्ष लेख में शामिल करने के बाद से इस एक तीसरी पार्टी अनुप्रयोग है डाल करने के लिए।

अग्रिम विशेषज्ञों में आपका धन्यवाद। कृपया मदद करे।

उत्तर

51

सरल उत्तर स्थानीय मूल या * तक पहुंच मूल शीर्षकों को सेट करना है।

और यहाँ है कि कैसे मैं आमतौर पर यह कार्य करें:

बुलाया Cors एक सरल मिडलवेयर बनाएँ: एप्लिकेशन/HTTP/मिडिलवेयर/Cors.php

public function handle($request, Closure $next) 
{ 
    return $next($request) 
     ->header('Access-Control-Allow-Origin', '*') 
     ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); 
} 
को

php artisan make:middleware Cors 

निम्न कोड जोड़ें

आप (*) को स्थानीयहोस्ट के साथ प्रतिस्थापित कर सकते हैं या इसे जारी रख सकते हैं।

अगला चरण मिडलवेयर लोड करना है। निम्न पंक्ति ऐप/एचटीपी/कर्नेल.एफ़पी में जोड़ें। $ रूटेड Middleware सरणी में लाइन जोड़ें।

'cors' => \App\Http\Middleware\Cors::class, 

और अंतिम चरण उन मार्गों पर मिडलवेयर का उपयोग करना है, जिन पर आप पहुंच मूल शीर्षलेख सेट करना चाहते हैं। मान लीजिए कि आप लार्वेल 5.3 में नए एपीआई रूट्स के बारे में बात कर रहे हैं, ऐसा करने के लिए जगह ऐप/प्रदाता/रूट सर्विस सर्विसप्रोवाइडर.एफ़पी है, नक्शा एपीआई रूट्स() फ़ंक्शन के अंदर।

Route::group([ 
     'middleware' => ['api', 'cors'], 
     'namespace' => $this->namespace, 
     'prefix' => 'api', 
    ], function ($router) { 
+0

मैं यह काम भी करने की कोशिश कर रहा हूं ([यहां देखें] (https: // stackoverflow।कॉम/प्रश्न/46 991025/एक्सेस-कंट्रोल-अनुमति-मूल-हेडर-प्रतिक्रिया-इन-लार्वेल -5-4-काम-के-पोस्ट-पोस्ट-पोस्ट)) लेकिन किसी कारण से केवल GET अनुरोध काम करते हैं। कोई विचार क्यों POST मेरे सेटअप के साथ काम नहीं कर रहा है? इसके अलावा .. मिडलवेयर का आदेश मायने रखता है। – displayname

+0

मैं AJAX कॉल कर रहा हूं और यह समाधान मेरे लिए कोई सुझाव नहीं देता है, कोई सुझाव? –

+0

अच्छा, यह मेरे लिए काम कर रहा है। धन्यवाद –

11

आप महान laravel-cors package by barryvdh का भी उपयोग कर सकते हैं।

protected $middleware = [ 
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
    \Barryvdh\Cors\HandleCors::class, 
]; 

आप न CORS करना चाहते हैं:

आप पैकेज स्थापित करने के बाद, सबसे आसान तरीका है अपने सभी मार्गों के लिए CORS समर्थन प्राप्त करने के HTTP/Kernel.php में इस तरह मिडलवेयर जोड़ने के लिए है अपने सभी मार्गों पर समर्थन आपको /oauth/token के लिए एक नया विकल्प मार्ग बनाना चाहिए और केवल उस मार्ग पर कॉर्स मिडलवेयर जोड़ें।

1

सावधान रहें, आप प्रीफलाइट को संशोधित नहीं कर सकते हैं। इसके अलावा, ब्राउज़र (कम से कम क्रोम) "प्रमाणीकरण" हेडर को हटा देता है ... इसके परिणामस्वरूप कुछ समस्याएं होती हैं जो रूट डिज़ाइन के अनुसार उत्पन्न हो सकती हैं। उदाहरण के लिए, प्रीफलाइट कभी भी पासपोर्ट रूट शीट दर्ज नहीं करेगा क्योंकि इसमें टोकन के साथ हेडर नहीं है।

यदि आप विकल्प विधि के कार्यान्वयन के साथ फ़ाइल डिज़ाइन कर रहे हैं, तो आपको रूट फ़ाइल web.php एक (या एक से अधिक) "जाल" मार्ग में परिभाषित करना होगा ताकि प्रीफ्लैट (हेडर प्राधिकरण के बिना) अनुरोध को हल करें और संबंधित सीओआरएस हेडर प्राप्त करें। क्योंकि वे डिफ़ॉल्ट रूप से मिडलवेयर 200 में वापस नहीं आ सकते हैं, इसलिए उन्हें मूल अनुरोध पर हेडर जोड़ना होगा।