Estoy teniendo problema a la hora de añadir el middleware CORS de StackPHP. Estoy pasando un token en la petición a la API, pero me sigue dando problema después de añadir el middleware:
XMLHttpRequest cannot load http://url/api. Request header field X-Auth-Token is not allowed by Access-Control-Allow-Headers in preflight response.
Dejo aqui el código por si alguien me puede ayudar:
$stack = (new Stack\Builder())->push( new Cors($app, array( 'allowedHeaders' => array('x-allowed-header', 'x-auth-token'), 'allowedMethods' => array('DELETE', 'GET', 'POST', 'PUT'), 'allowedOrigins' => array('*'), 'exposedHeaders' => false, 'maxAge' => false, 'supportsCredentials' => false, )) ); $app = $stack->resolve($app);
Respuestas
Aunque no he usado StackPHP, y por eso no se si es "case-sensitive" o no, lo primero que probaría es a utilizar X-Auth-Token
en vez de x-auth-token
como valor de la cabecera en la opción allowedHeaders
.
@javiereguiluz
He probado pero sigue igual :S. parece que es problema de la clase que no se está utilizando.
@ZaoIsmael
Puede ser que el servidor no está devolviendo la respuesta la cabecera Access-Control-Allow-Headers
o que su valor no sea el correcto. Usa por ejemplo la herramienta curl
para hacer una petición y ver las cabeceras que te devuelven:
$ curl -s -D - http://...
@javiereguiluz
Mirando el network en el navegador me devuelve esto:
Access-Control-Allow-Headers:Content-Type Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS Access-Control-Allow-Origin:* Cache-Control:no-cache Connection:close Content-Type:text/html; charset=UTF-8 Date:Thu, 29 Oct 2015 16:44:18 GMT Server:Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 X-Powered-By:PHP/5.6.3 X-UA-Compatible:IE=edge,chrome=1
@ZaoIsmael
Pues parece que tanto la cabecera Access-Control-Allow-Headers
como la cabecera Access-Control-Allow-Methods
no se corresponden a lo que está configurado.
@javiereguiluz
Buenas, al final he conseguido hacerlo funcionar, dejo aquí la corrección por si a alguien le surge un problema parecido.
Tenia un error de implementación, el método push de Stack\Builder acepta como parámetros un callback o un string con el nombre de la clase y sus argumentos si lo necesitas:
Middleware como callback
$stack = (new Stack\Builder())->push( function ($app) { return new Cors($app, array( 'allowedHeaders' => array('Content-Type', 'X-Auth-Token', 'accept'), 'allowedMethods' => array('DELETE', 'GET', 'POST', 'PUT'), 'allowedOrigins' => array('*'), 'exposedHeaders' => false, 'maxAge' => false, 'supportsCredentials' => false, )); } ); $app = $stack->resolve($app); $request = Request::createFromGlobals(); $response = $app->handle($request)->send(); $app->terminate($request, $response);
Middleware utilizando el nombre de clase
$stack = (new Stack\Builder())->push('Asm89\Stack\Cors'); $app = $stack->resolve($app); $request = Request::createFromGlobals(); $response = $app->handle($request)->send(); $app->terminate($request, $response);
Muchas gracias por la ayuda Javier.
@ZaoIsmael
Gracias por compartir la solución. El problema es que no entiendo el código. ¿Quizás hay un error de "copiar y pegar"?
@javiereguiluz
Perdona Javier pero no entiendo la pregunta. donde dices que hay un error ?
@ZaoIsmael
Ya está corregida la confusión :) Antes no veía los títulos "Middleware como callback" y "Middleware utilizando el nombre de clase". Pensaba que era todo uno y estaba duplicado.
@javiereguiluz