2015-11-06 4 views
7

Ich habe versucht, dieses Problem für eine Weile zu lösen, aber nicht in der Lage, es zu knacken.Laravel CORS Middleware schlägt fehl für Post und Ressourcenanforderung

Ich habe ein Laravel Backend und eckiges Frontend. Diese sind auf verschiedenen Domains, da die Frontends eine Web- und Mobile-Cordova-App sein müssen.

Auch nach CORS-Middleware, Post und Ressourcenanforderung nicht geladen und ich bekomme einen

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

Fehler in der Konsole hinzugefügt wird.

Die folgende GET-Anfrage funktioniert gut: -

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

Aber nach denen scheitern -

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

I https://scotch.io/tutorials/token-based-authentication-for-angularjs-and-laravel-apps bin nach.

Mein 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

Können Sie angeben, welchen HTTP-Antwortcode Ihre Anfrage zurückgibt? Ich hatte kürzlich ein ähnliches Problem und meine Antworten gaben einen Code von 500 zurück, einen internen Serverfehler. Es stellte sich heraus, dass es nichts mit meinen Kopfzeilen zu tun hatte, sondern mit der Tatsache, dass ich CSRF nicht korrekt ausführte. Das Deaktivieren von CSRF hat es funktioniert. Vielleicht versuchen Sie das und sehen, ob es wirklich ein CORS-Problem ist oder etwas anderes wie in meinem Fall? –

+0

Okay, ich sehe, wo Sie CSRF deaktivieren, also ist es das nicht. Dennoch könnte die Kenntnis des HTTP-Antwortcodes einen Einblick geben. –

Antwort

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 scheint es etwas mit Post-Request-Header zu tun hat, nachdem das Token an einen Benutzer gewährt wird. jwt fügt in einem Autorisierungsheader und ein Cookie

0

vielleicht haben Sie die folgenden vorübergehend nutzen können, um es zu bekommen:

ich in der cors Middleware hinzugefügt in meinem Controller wie so konstruieren:

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

    } 

in Mein Kernel:

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 


]; 

dies scheint für mich arbeiten. Überprüfen Sie außerdem Ihr Laravel-Protokoll und debuggen Sie Ihren Controller. Ich hatte einen Tippfehler in meinem Controller und die HTTP-Antwort in meiner Client-Konsole war der Kors Fehler.

+0

nein, das funktioniert nicht für mich –

+0

hast du deine storage/logs/laravel.log überprüft? weil, wenn es einen Syntaxfehler in Ihrem Controller gibt, die Client-Nachricht immer noch sagen wird: (index): 1 XMLHttpRequest kann http: // localhost: 8000/api/v1/partner nicht laden. Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Origin 'http: // localhost: 9001' ist daher nicht erlaubt. Die Antwort hatte den HTTP-Statuscode 500. –

0

Hatte das gleiche Problem seit Stunden jetzt. Versuchte verschiedene Lösungen (verwendet die barryvdh/laravel-cors library, machte meine eigene CORS Middleware, fügte Header in der Datei index.php hinzu), aber nichts half mir aus.

Jetzt verwende ich https://github.com/neomerx/cors-illuminate und es funktioniert.

Einer der Unterschiede zwischen der Cors-Illuminate-Bibliothek und der Laravel-Cors-Bibliothek ist in der Installationsanleitung zu finden. An den cors beleuchten führen heißt es ausdrücklich, dass Sie die Middleware-Linie nach

direkt hinzufügen haben auch
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 

Vielleicht ist die Laravel-cors Bibliothek funktionieren würde, wenn Sie die Middleware direkt nach der CheckForMaintenanceMode Middleware hinzufügen. Habe es nicht ausprobiert.

0

In meinem Fall war der Fehler, dass ich Aufrufe ausführte, die die Anfrage vor dem Authentifizieren mit JWT umgingen. hatte ich diesen Code, der das Problem verursachen:

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

Wie Sie sehen können, war JWTAuth Linie vor einer Linie, die $ Anforderung verwendet. Sie können entweder die JWTAuth Linie forst Linie in Funktion verschieben oder einen Konstruktor in der Klasse wie folgt erstellen:

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

und löste das Problem cors. Ich benutze Barryvdh Cors.

Verwandte Themen