StackPHP, problema al utilizar un middleware en Silex

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

#1

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.

#2

He probado pero sigue igual :S. parece que es problema de la clase que no se está utilizando.

#3

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://...
#4

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
#5

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.

#6

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.

#7

Gracias por compartir la solución. El problema es que no entiendo el código. ¿Quizás hay un error de "copiar y pegar"?

#8

Perdona Javier pero no entiendo la pregunta. donde dices que hay un error ?

#9

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.