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.
Ispezionare la rete con qualcosa come Chrome Dev Tools indica che è lì o non lì (l'intestazione)? –
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
Non penso che le intestazioni siano impostate. Invece di '$ response-> headers-> set()' try 'header ('Allow: GET, POST, OPTIONS')' potrebbe funzionare –