2015-11-06 11 views
7

के लिए विफल रहता है मैं थोड़ी देर के लिए इस समस्या को हल करने का प्रयास कर रहा हूं, लेकिन इसे क्रैक करने में असमर्थ हूं।लैरवेल सीओआरएस मिडलवेयर पोस्ट और संसाधन अनुरोध

मेरे पास लैरवेल बैकएंड और कोणीय अग्रभाग है। ये अलग-अलग डोमेन पर हैं क्योंकि फ्रंटेंड को वेब और मोबाइल कॉर्डोवा ऐप होना चाहिए।

भी CORS मिडलवेयर, पोस्ट और संसाधन अनुरोध जोड़ने के बाद लोड करने के लिए असफल हो और मैं कंसोल में एक

No 'Access-Control-Allow-Origin' header is present on the requested resource 

त्रुटि मिलती है।

निम्नलिखित प्राप्त अनुरोध ठीक काम करता है: -

Route::get('example', ['middleware' => 'cors', function(){ 
    return Response::json(array('name' => 'Steve Jobs 1', 'company' => 'Apple')); 
}]); 

लेकिन निम्नलिखित लोगों असफल -

Route::group(['middleware' => 'cors'], function() { 
Route::group(['prefix' => 'api'], function() 
{ 
    Route::resources('authenticate', 'AuthenticateController', ['only' => ['index']]); 
    Route::post('authenticate', '[email protected]'); 
}); 
}); 

मैं https://scotch.io/tutorials/token-based-authentication-for-angularjs-and-laravel-apps अनुसरण कर रही हूं।

मेरे CORS.php

class CORS 
{ 
/** 
* Handle an incoming request. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Closure $next 
* @return mixed 
*/ 
public function handle($request, Closure $next) 
{ 
    header("Access-Control-Allow-Origin: *"); 

    // ALLOW OPTIONS METHOD 
    $headers = [ 
     'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE', 
     'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin' 
    ]; 
    if($request->getMethod() == "OPTIONS") { 
     // The client-side application can set only headers allowed in Access-Control-Allow-Headers 
     return Response::make('OK', 200, $headers); 
    } 

    $response = $next($request); 
    foreach($headers as $key => $value) 
     $response->header($key, $value); 
    return $response; 
    return $next($request); 
} 
} 

kernal.php

class Kernel extends HttpKernel 
{ 

protected $middleware = [ 
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
    \App\Http\Middleware\EncryptCookies::class, 
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
    \Illuminate\Session\Middleware\StartSession::class, 
    \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
    /*\App\Http\Middleware\VerifyCsrfToken::class,*/ 
]; 


protected $routeMiddleware = [ 
    'auth' => \App\Http\Middleware\Authenticate::class, 
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
    'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class, 
    'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class, 
    'cors' => 'App\Http\Middleware\CORS', 
]; 
} 
+0

क्या आप अपना अनुरोध लौटाते हुए HTTP प्रतिक्रिया कोड पोस्ट कर सकते हैं? मुझे हाल ही में एक ही समस्या हो रही थी और मेरे जवाब 500 के कोड, एक आंतरिक सर्वर त्रुटि लौट रहे थे। यह पता चला कि मेरे हेडर के साथ कुछ लेना देना नहीं था, लेकिन तथ्य यह है कि मैं सीएसआरएफ सही तरीके से नहीं कर रहा था। सीएसआरएफ को अक्षम करने से यह काम करता है। शायद इसे आज़माएं और देखें कि क्या यह वास्तव में एक कॉरस समस्या है या मेरे मामले में कुछ और है? –

+0

ठीक है, मैं देखता हूं कि आप सीएसआरएफ को अक्षम करते हैं, इसलिए ऐसा नहीं है। फिर भी, HTTP प्रतिक्रिया कोड जानने से कुछ अंतर्दृष्टि मिल सकती है। –

उत्तर

0

Seems it has something to do with post request headers after the token is granted to a user. jwt adds in an authorization header and a cookie लगता है यह पोस्ट अनुरोध हेडर के साथ कुछ है के बाद टोकन एक उपयोगकर्ता के लिए दी जाती है।

मैं अपने नियंत्रक में CORS मिडलवेयर में जोड़ा तो तरह का निर्माण: में

 public function __construct() 
    { 
     // Apply the jwt.auth middleware to all methods in this controller 
     // except for the index method. 
     $this->middleware('jwt.auth', ['except' => ['index']]); 
     $this->middleware('cors'); 

    } 

जेडब्ल्यूटी एक प्राधिकरण शीर्षक और एक कुकी

0

हो सकता है आप अस्थायी रूप से इसके चारों ओर पाने के लिए निम्नलिखित का उपयोग कर सकते में कहते हैं मेरा कर्नेल:

protected $routeMiddleware = [ 
    'auth' => \App\Http\Middleware\Authenticate::class, 
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 

    'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class, 
    'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class, 
    'cors'=> \Barryvdh\Cors\HandleCors::class 


]; 

ऐसा लगता है कि यह मेरे लिए काम कर रहा है। साथ ही, अपने लार्वा लॉग की जांच करें और अपने नियंत्रक को डीबग करें। मेरे नियंत्रक में एक टाइपो था और मेरे क्लाइंट कंसोल में http प्रतिक्रिया कोर त्रुटि थी।

+0

नहीं, यह मेरे लिए काम नहीं कर रहा है –

+0

क्या आपने अपना स्टोरेज/लॉग/laravel.log देखा है? क्योंकि यदि आपके नियंत्रक में कोई वाक्यविन्यास त्रुटि है, तो क्लाइंट संदेश अभी भी कहेंगे: (अनुक्रमणिका): 1 XMLHttpRequest http: // localhost: 8000/api/v1/partner लोड नहीं कर सकता है। अनुरोधित संसाधन पर 'पहुंच-नियंत्रण-अनुमति-उत्पत्ति' शीर्षलेख मौजूद नहीं है। उत्पत्ति 'http: // localhost: 9 001' इसलिए पहुंच की अनुमति नहीं है। प्रतिक्रिया में HTTP स्थिति कोड 500 था। –

0

अब घंटों के लिए एक ही समस्या थी। विभिन्न समाधानों का प्रयास किया (barryvdh/laravel-cors library का उपयोग किया, अपना स्वयं का सीओआरएस मिडलवेयर बनाया, index.php फ़ाइल में हेडर जोड़े गए) लेकिन कुछ भी मेरी मदद नहीं कर पाया।

अब मैं https://github.com/neomerx/cors-illuminate का उपयोग कर रहा हूं और यह काम करता है।

कोर-रोशनी लाइब्रेरी और लार्वेल-कॉर्स लाइब्रेरी के बीच अंतर में से एक स्थापना मार्गदर्शिका में है। पर CORS-स्पष्ट करना यह स्पष्ट रूप से मार्गदर्शन कहते हैं तो आप सीधे के बाद

\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 

शायद laravel-CORS पुस्तकालय भी काम करेगा मिडलवेयर पंक्ति जोड़ने के लिए, यदि आप CheckForMaintenanceMode Middleware के बाद सीधे मिडिलवेयर जोड़ने है। इसे आजमाया नहीं।

0

मेरे मामले में, त्रुटि यह थी कि मैं कॉल निष्पादित कर रहा था जो jwt के साथ स्वाइन करने से पहले अनुरोध को envolved।

function store(Request $request) 
{ 
    $producto = new Producto($request->json()->all()); 
    $this->currentUser = JWTAuth::parseToken()->authenticate(); 
    $producto->cliente_id = $this->currentUser->cliente_id; 
    $producto->save(); 
    return json_encode($producto); 
} 

आप देख सकते हैं, JWTAuth लाइन एक लाइन जो $ अनुरोध का उपयोग करता है से पहले किया गया था: मैं इस कोड है कि समस्या का कारण था। आप या तो समारोह में Forst लाइन के लिए JWTAuth लाइन स्थानांतरित कर सकते हैं या इस तरह कक्षा में एक निर्माता बनाने के लिए:

function __construct() { 
    $this->currentUser = JWTAuth::parseToken()->authenticate(); 
} 

और उस CORS समस्या हल हो जाती। मैं बैरीवध कॉर्स का उपयोग करता हूं।

संबंधित मुद्दे