إضافة رؤوس HTTP إلى الإضافة قيد التطوير

الحالة:

أقوم بتطوير إضافة (plugin) وأستخدم nginx كعكسي وكيل (reverse proxy) إلى rails:3000، ويعمل كل شيء بشكل رائع، لكنني أواجه صعوبة في الوصول إلى واجهة برمجة التطبيقات (API) بسبب أخطاء CORS المزعجة التي نعرفها جميعًا ونحبها.

تم منع الوصول إلى XMLHttpRequest إلى 'blah blah blah' من المصدر 'foo bar bing' بسبب سياسة CORS: لا يوجد رأس 'Access-Control-Allow-Origin' في المورد المطلوب.

حتى الآن، حاولت إضافة رؤوس (headers) إلى nginx، لكن لسبب ما، لا تظهر هذه الرؤوس في الرؤوس عند التصحيح في Chrome.

كما جربت استخدام nginx لتعديل proxy_headers من rails إلى nginx، لكن دون جدوى.

أيضًا، جربت استخدام إضافة ملحق Chrome لإدراج الرؤوس، لكن يبدو أنها لا تعمل أيضًا، على الرغم من أن اختبار CORS للمتصفح باستخدام موقع اختبار CORS يظهر أن كل شيء مسموح به.

ثم جربت إضافة gem الخاص بـ rack-cors, لكن لم أستطع جعل config.middleware يعمل بسبب أخطاء freeze.

هذا الأمر يعيق التطوير ويبدو أنني وصلت إلى طريق مسدود :frowning:

هل هناك طريقة لإضافة هذه الرؤوس مباشرة في Discourse في ملف إعدادات (أو الأفضل في الإضافة) والتي ستُرسل رؤوس HTTP المختلفة التي نرغب في اختبارها وإرسالها في بيئة التطوير؟

أو، هل من الممكن جعل gem الخاص بـ rack-cors يعمل؟ إذا كان الأمر كذلك، فأين في الإضافة يجب أن أضيف الكود؟

المرجع: RubyDoc.info: File: README – Documentation for rack-cors (0.4.0) – RubyDoc.info

كما ذكرت، فإن الأشياء (الكثيرة) التي جربتها حتى الآن وما ورد أعلاه في rubydocs تؤدي جميعها إلى “لم يحدث هنا”، نفس الشيء القديم.

حتى جربت نسيان CORS مؤقتًا، وإضافة رأس تخزين HTTP واحد فقط، لكن هذا أيضًا كان طريقًا مسدودًا من جهتي.

أعتقد أن الجميع يضحك على هذه المشاكل المتعلقة بـ CORS، وأنا أيضًا؛ ولكن إذا كان بإمكانك مشاركة كيفية إضافة رؤوس اختبار خاصة بي (سواء كانت CORS أم لا) أثناء وجودي في بيئة الاختبار التطويرية، فسأكون ممتنًا جدًا.

شكرًا لك.

هل هناك سبب لعدم عمل دعم CORS القياسي لدينا وإعداد الموقع cors_origins بالنسبة لك؟

مرحبًا @sam

لا أعرف السبب الذي يجعل دعم CORS المدمج لا يعمل بالنسبة لي، لكنني جربت العديد من الإدخالات، بما في ذلك إدخالات من نوع الرمز الشامل هذه. ربما أنا أخطئ في ذلك؟

آسف، لم أذكر هذا في المنشور الأصلي…

ربما أحتاج إلى إعداد متغير البيئة (ENV) هذا؟

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

هل أحتاج إلى تعيين بعض متغيرات البيئة؟ إذا كان الأمر كذلك، فأين؟ ربما يكون هذا هو خطئي؟

شكرًا لك!

بالمناسبة، قمت بتعيين هذا في مُهيئ الإضافة:

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

ويُظهر console.log أن هذه الإعدادات صحيحة… لكن خطأ “رفض الوصول” المزعوم لا يزال يظهر في وحدة التحكم أيضًا :(.