Añadiendo cabeceras HTTP al plugin en desarrollo

Situación:

Estoy desarrollando un plugin y usando nginx como proxy inverso hacia rails:3000. Todo funciona genial, pero tengo problemas para acceder a la API debido a los temidos errores de CORS, que todos conocemos y “adoramos”.

El acceso a XMLHttpRequest en 'blah blah blah' desde el origen 'foo bar bing' ha sido bloqueado por la política CORS: no se incluye el encabezado 'Access-Control-Allow-Origin' en el recurso solicitado.

Hasta ahora, he intentado agregar encabezados en nginx, pero por alguna razón, estos no aparecen en los encabezados al depurar en Chrome.

También intenté usar nginx para modificar los proxy_headers desde Rails hacia nginx, pero sin éxito.

Además, probé usar un plugin de extensión de Chrome para insertar los encabezados, pero tampoco parecen funcionar, aunque una prueba de CORS del navegador usando un sitio de pruebas de CORS indica que todo está permitido.

Luego, intenté agregar el gem rack-cors, pero no pude hacer que config.middleware funcionara debido a errores de freeze.

Esto está frenando el desarrollo y parece que he dado contra un muro :frowning:

¿Existe alguna forma de agregar estos encabezados directamente en Discourse en un archivo de configuración (o mejor aún, en el plugin) que envíe varios encabezados HTTP que queremos probar y enviar en el entorno de desarrollo?

¿O es posible hacer que el gem rack-cors funcione? Si es así, ¿dónde en el plugin debería agregar el código?

Referencia: RubyDoc.info: File: README – Documentation for rack-cors (0.4.0) – RubyDoc.info

Como mencioné, las (muchas) cosas que he intentado hasta ahora y las descritas arriba en rubydocs todas resultan en “no ocurre aquí”, lo de siempre.

Incluso intenté olvidar CORS por el momento y simplemente agregar un solo encabezado de caché HTTP, pero eso también fue un callejón sin salida de mi parte.

Imagino que todos se ríen de estos problemas relacionados con CORS; yo también. Pero si pudieran compartir conmigo cómo agregar mis propios encabezados de prueba (CORS o no) mientras estoy en el entorno de pruebas de desarrollo, se lo agradecería mucho.

Gracias.

¿Hay alguna razón por la que nuestro soporte CORS estándar y la configuración del sitio cors_origins no estén funcionando para ti?

1 me gusta

Hola @sam

No sé por qué la compatibilidad con CORS integrada no funciona para mí, pero he probado muchas entradas, incluyendo este tipo de entradas de comodín. ¿Quizás lo estoy haciendo mal?

Lo siento, ya mencioné esto en la publicación original…

¿Quizás necesito configurar esta variable de entorno?

  if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
    return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
  end

¿Necesito definir algunas variables de entorno? Si es así, ¿dónde? ¿Quizás este sea mi error?

¡Gracias!

Por si acaso, establezco esto en el inicializador del plugin:

Discourse.SiteSettings.discourse_enable_cors = true;
Discourse.SiteSettings.discourse_cors_origin = "*";

y console.log muestra que estas configuraciones están bien… pero el temido “access denied” sigue apareciendo en la consola también :frowning: