2015-11-06 10 views
7

Ho cercato di risolvere questo problema per un po ', ma non sono riuscito a risolverlo.Il middleware Laravel CORS non riesce per la richiesta di posta e risorsa

Ho un backend Laravel e frontend angolare. Si tratta di domini diversi in quanto i front-end devono essere un'app cordova web e mobile.

Anche dopo l'aggiunta di CORS middleware, posta e richiesta di risorse non riescono a caricare e ottengo un errore di

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

in consolle.

La seguente richiesta get funziona bene: -

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

Ma successive fail -

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

sto seguendo https://scotch.io/tutorials/token-based-authentication-for-angularjs-and-laravel-apps.

mio 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

Puoi pubblicare quale codice di risposta HTTP restituisce la richiesta? Stavo riscontrando un problema simile recentemente e le mie risposte stavano restituendo un codice di 500, un errore interno del server. Risultò che non aveva nulla a che fare con le mie intestazioni ma il fatto che non stavo facendo CSRF correttamente. La disabilitazione di CSRF ha funzionato. Forse provarlo e vedere se è veramente un problema CORS o qualcos'altro come nel mio caso? –

+0

Ok, vedo dove si disattiva CSRF, quindi non è quello. Tuttavia, conoscere il codice di risposta HTTP potrebbe dare qualche idea. –

risposta

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 Sembra che abbia qualcosa a che fare con la richiesta Inserisci intestazioni dopo il token viene concesso a un utente. JWT aggiunge in un'intestazione di autorizzazione e un cookie

0

forse è possibile utilizzare il seguente per ottenere temporaneamente intorno ad esso:

ho aggiunto nel middleware cors nel mio controller costruire in questo modo:

 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 il mio 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 


]; 

sembra funzionare per me. Inoltre, controlla il tuo log di laravel e fai il debug del controller. Ho avuto un errore di battitura nel mio controller e la risposta http nella mia console client era l'errore cors.

+0

no, questo non funziona per me –

+0

hai controllato il tuo archivio/log/laravel.log? perché se si verifica un errore di sintassi nel controller, il messaggio del client continua a indicare: (indice): 1 XMLHttpRequest non può caricare http: // localhost: 8000/api/v1/partner. Nessuna intestazione 'Access-Control-Allow-Origin' è presente sulla risorsa richiesta. L'origine 'http: // localhost: 9001' non è quindi consentita l'accesso. La risposta aveva codice di stato HTTP 500. –

0

Aveva lo stesso problema per ora. Ho provato soluzioni diverse (ho usato il barryvdh/laravel-cors library, ho creato il mio middleware CORS, ho aggiunto intestazioni nel file index.php) ma nulla mi ha aiutato.

Ora sto usando https://github.com/neomerx/cors-illuminate e funziona.

Una delle differenze tra la libreria cors-illuminate e la libreria laravel-cors è nella guida all'installazione. Alle cors-illuminare guidarlo in modo esplicito dice che si deve aggiungere la riga middleware subito dopo

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

Forse biblioteca laravel-cors funzionerebbe anche, se si aggiunge il Middleware direttamente dopo il CheckForMaintenanceMode Middleware. Non l'ho provato.

0

Nel mio caso, l'errore era che stavo eseguendo chiamate che coinvolgevano la richiesta prima dell'autenticazione con jwt. ho avuto questo codice che causano il problema:

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

Come si può vedere, la linea JWTAuth era prima una linea che utilizza $ richiesta. È possibile spostare la linea JWTAuth alla linea Forst in funzione o creare un costruttore della classe in questo modo:

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

e che risolto il problema cors. Io uso Barryvdh Cors.

Problemi correlati