Ajout d'en-têtes HTTP à un plugin en cours de développement

Situation :

Je développe un plugin et j’utilise nginx comme proxy inverse vers rails:3000. Tout fonctionne très bien, mais je rencontre des problèmes d’accès à l’API avec les redoutables erreurs CORS, que nous connaissons tous et que nous « aimons » tant.

Accès à XMLHttpRequest à 'blah blah blah' depuis l'origine 'foo bar bing' bloqué par la politique CORS : l'en-tête 'Access-Control-Allow-Origin' est absent de la ressource demandée.

Jusqu’à présent, j’ai essayé d’ajouter des en-têtes dans nginx, mais pour une raison quelconque, ces en-têtes n’apparaissent pas lors du débogage dans Chrome.

J’ai également essayé d’utiliser nginx pour modifier les proxy_headers de Rails vers nginx, mais sans succès.

J’ai aussi essayé d’utiliser une extension Chrome pour insérer les en-têtes, mais cela ne semble pas fonctionner non plus, même si un test CORS du navigateur via un site de test CORS indique que tout est autorisé.

Ensuite, j’ai essayé d’ajouter le gem rack-cors, mais je n’ai pas réussi à faire fonctionner config.middleware en raison d’erreurs de freeze.

Cela bloque le développement et j’ai l’impression d’avoir atteint un mur :frowning:

Existe-t-il un moyen d’ajouter ces en-têtes directement dans Discourse dans un fichier de configuration (ou mieux encore dans le plugin) afin d’envoyer les divers en-têtes HTTP que nous souhaitons tester et envoyer dans l’environnement de développement ?

Ou est-il possible de faire fonctionner le gem rack-cors ? Si oui, où dans le plugin devrais-je ajouter le code ?

Réf : RubyDoc.info: File: README – Documentation for rack-cors (0.4.0) – RubyDoc.info

Comme mentionné, les (nombreuses) choses que j’ai essayées jusqu’à présent et ci-dessus dans rubydocs se soldent toutes par « ça ne fonctionne pas ici », toujours pareil.

J’ai même essayé d’oublier CORS pour le moment et d’ajouter simplement un seul en-tête de cache HTTP, mais cela aussi s’est avéré être une impasse de mon côté.

Je suppose que tout le monde rit de ces problèmes liés à CORS, moi aussi ; mais si vous pouviez me partager comment ajouter mes propres en-têtes de test (CORS ou non) dans l’environnement de test de développement, je vous en serais très reconnaissant.

Merci.

Y a-t-il une raison pour laquelle notre support CORS standard et le paramètre de site cors_origins ne fonctionnent pas pour vous ?

Bonjour @sam

Je ne connais pas la raison pour laquelle le support CORS intégré ne fonctionne pas pour moi, mais j’ai essayé de nombreuses entrées, y compris ce type d’entrées wild-card. Peut-être que je le fais mal ?

Désolé, je l’ai mentionné dans le message d’origine…

Je dois peut-être configurer cette variable d’environnement ?

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

Dois-je définir certaines variables d’environnement ? Si oui, où ? Peut-être que c’est là que j’ai échoué ?

Merci !

Pour info, j’ai défini ceci dans l’initialiseur du plugin :

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

et console.log indique que ces paramètres sont corrects… mais l’indésirable « access denied » apparaît toujours dans la console :frowning: