2013-07-09 23 views
17

Sto scrivendo un'API e utilizzo Laravel 4 per ottenere ciò. La mia API è in un dominio diverso. lascia supporre che si tratta di: http://api-example.com/CORS with Laravel 4

e quando provo a fare richieste Ajax via Backbone alla mia api dalla mia web-app (cioè mydomain.com) con l'autenticazione di base, a volte funziona bene, ma a volte non è così. Sto cercando di capire perché. Di seguito sono il mio filtro App::before e il filtro App::after.

App::before(function($request) 
{ 
    if($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { 
     $statusCode = 204; 

     $headers = [ 
      'Access-Control-Allow-Origin'  => 'http://mydomain.com', 
      'Allow'       => 'GET, POST, OPTIONS', 
      'Access-Control-Allow-Headers'  => 'Origin, Content-Type, Accept, Authorization, X-Requested-With', 
      'Access-Control-Allow-Credentials' => 'true' 
     ]; 

     return Response::make(null, $statusCode, $headers); 
    } 
}); 

E il mio dopo filtro:

App::after(function($request, $response) 
{ 
    $response->headers->set('Access-Control-Allow-Origin', 'http://mydomain.com'); 
    $response->headers->set('Allow', 'GET, POST, OPTIONS'); 
    $response->headers->set('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Requested-With'); 
    $response->headers->set('Access-Control-Allow-Credentials', 'true'); 
    return $response; 
}); 

Il fatto è che quando cerco di fare una richiesta post per /login con le credenziali, API controlla il db e ottiene la chiave API per l'utente. Questo funziona perfettamente. Ma quando provo a fare una richiesta POST a /users cromo appena mi dà errore seguente:

XMLHttpRequest cannot load http://api-example.com/users. Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin. 

Ho provato di tutto, come l'impostazione Access-Control-Allow-Origin a '*' tutto quello che potevo essere in grado di trovare da internet. Ma nulla ha funzionato finora. Non so cosa dovrei fare.

+1

Ispezionare la rete con qualcosa come Chrome Dev Tools indica che è lì o non lì (l'intestazione)? –

+0

Qualsiasi operazione non GET esegue prima una richiesta "pre-volo" OPTIONS - come sembra di sapere. Assicurati che il tuo filtro precedente sia eseguito anche quando non esiste alcuna rotta per abbinarlo. Inoltre, stai tentando di PUT o DELETE richieste? Le intestazioni non consentono quelle. Infine, l'origine '*' non può essere utilizzata con l'autorizzazione. In realtà, ultima nota: qual è la tua richiesta Ajax? jQuery ha un'impostazione per l'invio di richieste con autorizzazione. – fideloper

+0

Non penso che le intestazioni siano impostate. Invece di '$ response-> headers-> set()' try 'header ('Allow: GET, POST, OPTIONS')' potrebbe funzionare –

risposta

0

Alcuni browser possono negare questa, perché gli script XSS stanno facendo cose brutte in questo modo.

Se si carica il file js da http://api-example.com/ potrebbe aiutare, ma ci sono soluzioni più stabili:

  • È possibile usare curl (o qualcosa di simile) o
  • È possibile utilizzare un proxy (Apache, Nginx , ecc) per la vostra richiesta AJAX per caricare la risposta da parte l'altro host
  • oppure, se si sta useing un bilanciatore di carico, o roba di cache frontend, è possibile creare una regola ...

e de dipende dalla tua infrastruttura e dai tuoi bisogni, ma se le prestazioni sono importanti, salta l'arricciatura.

+0

Mi dispiace, ma sono davvero un principiante sulle cose del bilanciamento del carico, puoi spiegare in dettaglio, se per te va bene? Perché sto usando Amazon ELB per il bilanciamento del carico, e non conosco il significato di 'creare una regola'. –

3

Non ha senso fare un oggetto di risposta di fantasia e di restituirla, lasciando poi la corsa processo di pagina in quanto sarà obliterare i tuoi CORS intestazioni e continuare con il contenuto del solito.

App::before(function($request) 
{ 
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { 

     header('Access-Control-Allow-Origin', 'http://mydomain.com'); 
     header('Allow', 'GET, POST, OPTIONS'); 
     header('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Request-With'); 
     header('Access-Control-Allow-Credentials', 'true'); 

     exit; 
    } 
}); 
6

C'è un errore nel nome dell'intestazione.

header('Allow', 'GET, POST, OPTIONS'); // This is wrong. 

header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // This is right.    
+0

Questo è l'errore reale. Sto facendo la stessa cosa con la RISPOSTA corretta e sta funzionando bene con me. @ Umut-Sirin – Raftalks